From 2a0a0287d47bd51eef6d3369ca74c7f673e72b39 Mon Sep 17 00:00:00 2001 From: buttle Date: Tue, 10 Feb 2015 19:20:01 +0100 Subject: [PATCH 001/159] Added EVENT to homestubnav Changed menu->submenu(). if (! $menu->getItems()) then do nothing --- lib/homestubnav.php | 20 ++++++++++++-------- lib/menu.php | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/homestubnav.php b/lib/homestubnav.php index 7dd6ae19a1..d22d1fd16c 100644 --- a/lib/homestubnav.php +++ b/lib/homestubnav.php @@ -49,13 +49,17 @@ class HomeStubNav extends Menu { function getItems() { - return array(array('top', - array(), - // TRANS: Menu item in personal group navigation menu. - _m('MENU','Home'), - // TRANS: Menu item title in personal group navigation menu. - // TRANS: %s is a username. - _('Back to top'), - 'nav_return_top')); + if (Event::handle('StartHomeStubNav', array(&$this->action))) { + return array(array('top', + array(), + // TRANS: Menu item in personal group navigation menu. + _m('MENU','Home'), + // TRANS: Menu item title in personal group navigation menu. + // TRANS: %s is a username. + _('Back to top'), + 'nav_return_top')); + Event::handle('EndHomeStubNav', array(&$this->action)); + } + return Null; } } diff --git a/lib/menu.php b/lib/menu.php index 27503aa06b..3d22ff4924 100644 --- a/lib/menu.php +++ b/lib/menu.php @@ -150,6 +150,8 @@ class Menu extends Widget function submenu($label, $menu) { + if(!$menu->getItems()) + return; $this->action->elementStart('li'); $this->action->element('h3', null, $label); $menu->show(); From a1061c7145f0514df35ee245d10fabc15c1377e7 Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Wed, 11 Feb 2015 09:58:28 +0100 Subject: [PATCH 002/159] fixed neo-quitter web view --- theme/neo-quitter/css/display.css | 924 ++++++------------------------ 1 file changed, 165 insertions(+), 759 deletions(-) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index 1d1c5c639f..d28251c967 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -107,7 +107,6 @@ h6 {font-size: 1em;} #site_nav_object li a:hover, #showstream .entry-metadata .repeat, body#outbox #core ul.messages .notice:before, -.form_user_subscribe input[type="submit"], #header:before, address { background-image: url("../icons-hires.png?v=2"); @@ -161,10 +160,12 @@ address a { min-height:calc(100vh - 46px); } -#content_inner { - width:544px; - overflow-x:hidden; - } + +#core .h-card .u-photo { + float: left; + margin-right: 8px; + margin-left: 4px; +} #aside_primary_wrapper { background-color: transparent; @@ -283,7 +284,7 @@ address a { width: 20px; z-index: 2; background-position: 0px -293px; - } +} /* hide site notice after 5 s */ #site_notice { @@ -322,6 +323,7 @@ address a { overflow:hidden; } } + @-webkit-keyframes hideSiteNotice { to { bottom:-1000px; @@ -367,6 +369,10 @@ address a { padding: 12px 40px 40px 0; } +#content_inner { + width: 542px; +} + /* faq */ body#doc #content_inner { background-color:#fff; @@ -437,12 +443,17 @@ body#doc #content_inner p.faq-credits { width: 542px; } +.input_form .form_settings li input { + margin: 0 0 5px 5px; +} + .input_form fieldset fieldset label { + left: 10px; background: #f7f7f7; } .input_forms > label { - margin: 4px 1ex; + margin: 10px 1ex; } #input_form_nav { @@ -463,6 +474,7 @@ body#doc #content_inner p.faq-credits { padding: 5px 10px; cursor: pointer; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5); + margin: 5px; } #input_form_nav li.current a { @@ -538,7 +550,6 @@ body #aside_primary .account_profile_block .user_profile_tags { border-style: solid; border-width: 1px; padding: 12px 12px 0; - width: 518px; padding:20px; margin-bottom:20px; } @@ -687,115 +698,6 @@ ul.profile_list li { margin-top: 0; } -#aside_primary .account_profile_block .entity_actions { - opacity:1; -} - -#aside_primary .account_profile_block .entity_actions li { - margin-bottom:3px; -} - -#aside_primary .account_profile_block .entity_actions input[type="submit"], -#aside_primary .account_profile_block .entity_actions p { - width:114px; - text-align:center; -} - -#aside_primary .account_profile_block .entity_actions input[type="submit"], -#aside_primary .account_profile_block .entity_actions p, -.form_user_subscribe input[type="submit"], -.form_user_unsubscribe input[type="submit"], -.form_user_block input[type="submit"] { - background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(221,221,221,1) 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(221,221,221,1))); - background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(221,221,221,1) 100%); - background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(221,221,221,1) 100%); - background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(221,221,221,1) 100%); - background: linear-gradient(to bottom, rgba(255,255,255,1) 0%,rgba(221,221,221,1) 100%); - background-repeat: repeat-x; - border: 1px solid #cccccc; - border-radius: 4px; - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - color: rgba(0,0,0,0.8); - cursor: pointer; - display: inline-block; - font-family: "Helvetica Neue",Arial,sans-serif; - font-size: 13px; - font-weight: bold; - line-height: 18px; - margin: 0; - padding: 0; - position: relative; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5); - padding:5px 10px; - margin-bottom:4px; - box-sizing: border-box; - margin-left:-4px; - text-align:center; -} - -#aside_primary .account_profile_block .entity_actions input[type="submit"]:hover, -#aside_primary .account_profile_block .entity_actions p:hover, -.form_user_subscribe input[type="submit"]:hover { - background-color: #D8D8D8; - background: -moz-linear-gradient(top, rgba(248,248,248,1) 0%, rgba(216,216,216,1) 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(248,248,248,1)), color-stop(100%,rgba(216,216,216,1))); - background: -webkit-linear-gradient(top, rgba(248,248,248,1) 0%,rgba(216,216,216,1) 100%); - background: -o-linear-gradient(top, rgba(248,248,248,1) 0%,rgba(216,216,216,1) 100%); - background: -ms-linear-gradient(top, rgba(248,248,248,1) 0%,rgba(216,216,216,1) 100%); - background: linear-gradient(to bottom, rgba(248,248,248,1) 0%,rgba(216,216,216,1) 100%); - border-color: #BBBBBB; - text-decoration: none; -} - -.form_user_subscribe input[type="submit"] { - background: url("../icons-hires.png?v=1") no-repeat scroll 2px -219px / 150px 2786px, linear-gradient(to bottom, rgba(255, 255, 255, 1) 0%, rgba(221, 221, 221, 1) 100%) repeat scroll 0 0 rgba(0, 0, 0, 0) !important; - padding: 5px 0 5px 30px !important; - padding:5px 0 5px 30px !important; -} - -.form_user_subscribe input[type="submit"]:hover { - background: url("../icons-hires.png?v=1") 2px -219px / 150px 2786px no-repeat, linear-gradient(to bottom, rgba(248,248,248,1) 0%,rgba(216,216,216,1) 100%) !important; - padding:5px 0 5px 30px !important; -} - -.form_user_unsubscribe input[type="submit"] { - background-color: #019AD2 !important; - background: -moz-linear-gradient(top, rgba(51,188,239,1) 0%, rgba(1,154,210,1) 100%) !important; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(51,188,239,1)), color-stop(100%,rgba(1,154,210,1))) !important; - background: -webkit-linear-gradient(top, rgba(51,188,239,1) 0%,rgba(1,154,210,1) 100%) !important; - background: -o-linear-gradient(top, rgba(51,188,239,1) 0%,rgba(1,154,210,1) 100%) !important; - background: -ms-linear-gradient(top, rgba(51,188,239,1) 0%,rgba(1,154,210,1) 100%) !important; - background: linear-gradient(to bottom, rgba(51,188,239,1) 0%,rgba(1,154,210,1) 100%) !important; - background-repeat: repeat-x; - border-color: #057ED0 !important; - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1) inset !important; - color: #FFFFFF !important; - text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25) !important; -} - -.form_user_unsubscribe input[type="submit"]:hover, -.form_user_block input[type="submit"]:hover { - background-color: #c43c35 !important; - background: -moz-linear-gradient(top, rgba(238,95,91,1) 0%, rgba(196,60,53,1) 100%) !important; - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(238,95,91,1)), color-stop(100%,rgba(196,60,53,1))) !important; - background: -webkit-linear-gradient(top, rgba(238,95,91,1) 0%,rgba(196,60,53,1) 100%) !important; - background: -o-linear-gradient(top, rgba(238,95,91,1) 0%,rgba(196,60,53,1) 100%) !important; - background: -ms-linear-gradient(top, rgba(238,95,91,1) 0%,rgba(196,60,53,1) 100%) !important; - background: linear-gradient(to bottom, rgba(238,95,91,1) 0%,rgba(196,60,53,1) 100%) !important; - background-repeat: repeat-x; - border-color: #a93730 #a93730 #952f2a !important; - color:#ffffff !important; - text-shadow: none !important; -} - -/* smaller button in userdirectory */ -#userdirectory .form_user_subscribe input[type="submit"], -#userdirectory .form_user_unsubscribe input[type="submit"] { - font-size:11px; - width:110px; -} - .form_notice_placeholder .placeholder, .form_notice textarea , .input_form .form_settings li input, @@ -806,7 +708,7 @@ ul.profile_list li { } .input_form .form_settings .submit { - font-size: 1.1em; + line-height: 16px; } /* site nav local views */ @@ -1076,7 +978,7 @@ background:none; display: block; left: 5px; position: absolute; - top: 90px; + top: 93px; } .form_notice label.notice_data-attach:before { @@ -1095,44 +997,13 @@ background:none; text-align:left; } -.checkbox-wrapper.checked label.checkbox, -.checkbox-wrapper.unchecked label.checkbox { - background-image:none; - opacity: 0.6; - padding-left: 30px; - font-size:0; - color:transparent; -} - -.checkbox-wrapper.checked label.checkbox:before, -.checkbox-wrapper.unchecked label.checkbox:before { - content: "\f023"; - display: block; - font: 20px/1 "fa"; - height: 35px; - left: 0px; - position: absolute; - top: 0px; - width: 35px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color:rgba(0,0,0,0.6); - text-indent:0; - text-align:left; -} - -.checkbox-wrapper.unchecked label.checkbox:before { - content: "\f09c"; -} - .form_notice .count { right: -18px; top:65px; } .form_notice fieldset { - background-color: #F6F7F8; - height:130px; + height:135px; } .form_notice { @@ -1141,12 +1012,9 @@ background:none; .form_notice .checkbox-wrapper { display: block; - left: 35px; - margin-left: 10px; - overflow: hidden; + top: 96px; + left: 280px; position: absolute; - top: 97px; - width: 17px; } .form_notice .to-selector > label { @@ -1157,7 +1025,7 @@ background:none; display:block; position:absolute; top:99px; - left:75px; + left:45px; } #notice_action-submit { @@ -1182,7 +1050,6 @@ background:none; } .threaded-replies .form_notice textarea { - width: 495px; border:1px solid #dcdee3; } @@ -1265,6 +1132,7 @@ body#outbox #core ul.messages .notice:before { text-align: center; width: 533px; } + #pagination .nav_prev { display:none; } @@ -1320,6 +1188,16 @@ body#outbox #core ul.messages .notice:before { padding-top:20px; } +#page_notice { + clear: both; + margin-bottom: 18px; + color:rgba(0,0,0,0.4); + font-size:13px; + letter-spacing: 0.3px; +} + +/* notices etc */ + #content h1 { color: rgba(0,0,0,0.4); font-size: 13px; @@ -1331,14 +1209,6 @@ body#outbox #core ul.messages .notice:before { text-transform: uppercase; } -#page_notice { - clear: both; - margin-bottom: 18px; - color:rgba(0,0,0,0.4); - font-size:13px; - letter-spacing: 0.3px; -} - #content #content_inner > .threaded-notices > .notice, #content #content_inner > .threaded-notices > .infscr-pages > .notice, @@ -1359,160 +1229,50 @@ body#outbox #core ul.messages .notice:before { padding-bottom:0; } -#content #content_inner > .threaded-notices > .notice:hover, -#content #content_inner > .threaded-notices > .infscr-pages > .notice:hover, -#content #content_inner > .notices > .infscr-pages > .notice:hover, -#content #content_inner > .notices > .notice:hover, -#content #notices_primary > .threaded-notices > .notice:hover, -#content #notices_primary > .threaded-notices > .infscr-pages > .notice:hover, -#content #notices_primary > .notices > .infscr-pages > .notice:hover, -#content #notices_primary > .notices > .notice:hover { - border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.15) rgba(0,0,0,0.25); +#content .notice { + padding-bottom: 4px; } -#content .notice .p-author { - display: inline-block; - font-weight: bold; - height: 56px; - margin-right: 0; - white-space: nowrap; - padding-right:5px; +.notice div.entry-content { + font-size: 0.88em; + line-height: 1.2em; + margin-top: 6px; + opacity: 0.6; } - -ul.messages .notice .p-author { +.notice:hover div.entry-content { + opacity: 1; } -#content .notices > .notice > .threaded-replies .addressees { - display:none; +.user_in .notice div.entry-content { + max-width: 440px; } -.notice .addressees:before { - content: "\f105\00a0"; - color:#aaa; - font-family:fa; - font-weight:normal; +div.entry-content a.response:before { + content: "("; } -.notice .addressees { +div.entry-content a.response:after { + content: ")"; } -.notice .addressees { - display: inline-block; - font-weight: bold; - margin-bottom: 4px; - white-space: nowrap; - } - -.notice .addressees .group { - font-style:normal; - font-weight:bold; +.notice-options { + margin-top: 4px; } -.notice .addressees .addressee.group:before { - content: "!"; -} - -#popular_notices .notice .p-author { - display: inline; -} - -#core .p-author .u-photo { - float: left; - margin-right: 8px; - border-radius: 5px; -} - -#core #content .p-author:before { - border: 1px solid rgba(0, 0, 0, 0.2); - box-sizing: border-box; - content: ""; - display: block; - height: 48px; - left: 12px; - position: absolute; - top: 12px; - width: 48px; - border-radius: 5px; -} - -#core #content .peopletag-profile .p-author:before { - width:96px; - height:96px; - left: 0; - top: 0; -} - -#content .notice .e-content, -.user_in #content .notice .e-content { - font-size: 15px; - margin-left: 0; - margin-top: 0; - position: relative; - white-space: normal; - z-index: 10; -} - -.notice .attachment:not(.more) { - background: none; - padding-left:0; -} - -#content #content_inner > .threaded-notices > .notice > .entry-metadata, -#content #content_inner > .notices > .notice > .entry-metadata, -#content #notices_primary > .threaded-notices > .notice > .entry-metadata, -#content #notices_primary > .notices > .notice > .entry-metadata { - color: #9197a3; - margin-bottom: 7px; - margin-left: 56px; - margin-top: 12px; - position: absolute; - top: 24px; - width: 468px; - z-index: 10; -} - -#content #content_inner > .threaded-notices > .notice.notice-source-activity > .entry-metadata, -#content #content_inner > .notices > .notice.notice-source-activity > .entry-metadata, -#content #notices_primary > .threaded-notices > .notice.notice-source-activity > .entry-metadata, -#content #notices_primary > .notices > .notice.notice-source-activity > .entry-metadata { - margin-left: 0; -} - -#content .threaded-notices > .notice > .entry-metadata a, -#content .notices > .notice > .entry-metadata a { - color:#9197a3; -} - -#content .notices > .notice > .entry-metadata .conversation { - color:#006c9b; - font-style:italic; -} - -#content .notices > .notice > .threaded-replies .entry-metadata .conversation, -#content .notices > .notice > .threaded-replies .entry-metadata .source { - display:none; -} - -.entry-metadata span.source:before { - content:"\00a0ยท\00a0"; -} - -.e-content a.conversation:before { - content: " ("; -} - -.e-content a.conversation:after { - content: ")"; +.notice-options { + margin-top: 4px; } .notice-options .form_repeat.dialogbox { margin-right: 0px; border: 1px solid #aaa; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; border-radius: 4px; box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); - z-index: 90; - min-width:160px; + -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); + -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4); } .notice-options .form_repeat.dialogbox legend { @@ -1523,6 +1283,12 @@ ul.messages .notice .p-author { min-width: 80px; } +#content .threaded-replies .notice .author .photo { + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); +} + .user_in.realtime-popup .notice div.e-content { max-width: 320px; } @@ -1540,6 +1306,11 @@ ul.messages .notice .p-author { right: 10px !important; } + +#realtime_actions button { + margin-right: 5px; +} + .pagination { height: 1.2em; } @@ -1620,355 +1391,8 @@ ul.messages .notice .p-author { color: rgba(0, 0, 0, 0.3); } - -/* replies */ - -.notice-reply-placeholder { - display:none !important; - } - -.threaded-replies { - color: #222; - font-size: 13px; -} -.threaded-replies .notice-repeats, .threaded-replies .notice-faves { - font-size: 13px; -} - -.threaded-replies { - background: none repeat scroll 0 0 #F6F7F8; - border-left: 0 none; - border-top: 1px solid #e1e2e3; - clear: both; - color: #222; - float: left; - margin-bottom: 0px; - margin-left: -12px; - padding-right: 2px; - padding-top: 0; - width: 540px; -} - -#conversation .notices .notices { - background-color: rgba(200, 200, 200, 0.05); - float: left; - margin-left: -12px; - width: 540px; -} - -.threaded-replies:empty { - display:none; -} - -.threaded-replies .notice-faves:before, -.threaded-replies .notice-repeats:before, -.notice-reply-comments > a:before { - color: #006c9b; - content: "\f005"; - display: inline-block; - font: 14px/1 "fa"; - margin-right: 5px; - margin-top: -4px; - vertical-align: middle; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.threaded-replies .notice-repeats:before { - content: "\f079"; -} - -.notice-reply-comments > a:before { - font: 14px/1 "Genericons"; - content: "\f431"; -} - -#content .notice .threaded-replies .notice, -#content .notice .threaded-replies .notice-data, -#content .notice .threaded-replies .notice-reply-comments { - background: none repeat scroll 0 0 rgba(0, 0, 0, 0); - border-bottom: 1px solid #e1e2e3; - line-height: 1.36em; - margin-bottom: 0; - margin-left: 10px; - margin-top: 0; - padding-bottom: 1ex; - padding-top: 1ex; - width: 522px; -} - -#content .notice .threaded-replies .notice:nth-last-child(2), -#content .notice .threaded-replies .notice-data:nth-last-child(2), -#content .notice .threaded-replies .notice-reply-comments:nth-last-child(2) { - border-bottom: 0 none; -} - -.threaded-replies .notice .p-author { - float: left; - font-size: 13px; - height: auto; - margin-left: 40px; - padding-right: 5px; - position: relative; - z-index: 20; -} - -#core #content .threaded-replies .p-author:before { - height: 32px; - left: -40px; - top: 3px; - width: 32px; - z-index: 10; -} - -.threaded-replies .notice.h-entry .attachments, -.threaded-replies .notice .notice-faves, -.threaded-replies .notice .notice-repeats { - padding-left: 40px; -} - -.threaded-replies .notice .addressees, -.threaded-replies .notice .addressees li { - display: inline; -} - -#content .threaded-replies .notice .p-author .u-photo { - float: none; - height: 32px; - margin-left: -40px; - position: absolute; - top: 10px; - width: 32px; - top: 3px; -} - -#content .notice .threaded-replies .notice div.e-content { - margin: 0; - font-size:13px; - padding-left: 40px; - padding-top:0; -} - -.notice-options { - margin-bottom: 8px; - margin-top: 8px; - margin-right: 0px; - height:20px; -} - -#content .threaded-replies .entry-metadata, -#content .threaded-replies .notice-options { - margin-bottom: 2px; - margin-top: 2px; - margin-left:40px; -} - -#content .threaded-replies .notice-options { - bottom:0; - right:0px; - height:25px; -} - -#content .threaded-replies .notice-faves, -#content .threaded-replies .notice-repeats { - color:#9197a3; - font-size:12px; -} - -#content .threaded-notices .notice-options input.submit, -#content .threaded-notices .notice-options a, -#content .notices .notice-options input.submit, -#content .notices .notice-options a { - opacity: 1; - background-image:none; -} - -#content .threaded-notices .notice-options input.submit:hover, -#content .threaded-notices .notice-options a:hover, -#content .notices .notice-options input.submit:hover, -#content .notices .notice-options a:hover { - opacity: 1; -} - -#content .threaded-replies .notice-options input.submit, -#content .threaded-replies .notice-options a { - opacity: 1; -} - -#content .threaded-replies .notice-options input.submit:hover, -#content .threaded-replies .notice-options a:hover { - opacity: 1; -} - -.notice-options form:not(.dialogbox), -.notice-options a, -.notice-options .repeated { - float: left; - margin-left: 10px; - margin-right:0; - background-image:none; - position:relative; -} - -#content .threaded-notices .notice-options form:not(.dialogbox), -#content .threaded-notices .notice-options a, -#content .notices .notice-options form:not(.dialogbox), -#content .notices .notice-options a { - position:relative; -} - -#content .threaded-notices .notice-options form:not(.dialogbox) input, -#content .threaded-notices .notice-options a, -#content .notices .notice-options form:not(.dialogbox) input, -#content .notices .notice-options a, -#content .threaded-notices .notice-options span, -#content .notices .notice-options span { - position:relative; - height:25px; - width:25px; - opacity:1; -} - -.notice-options .notice_delete:before, -.notice-options .notice_reply:before, -.notice-options .form_favor:before, -.notice-options .form_disfavor:before, -.notice-options .form_repeat:not(.dialogbox):before, -.notice-options .repeated:before { - content: "\f005"; - display: block; - font: 20px/1 "fa"; - height: 20px; - left: 0px; - position: absolute; - top: 0px; - width: 20px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color:#ccc; - text-indent:0; - text-align:left; -} - -.notice-options .form_disfavor:before { - color:#ff9b00; -} - -.notice-options .notice_reply:before { - content: "\f112"; - margin-top:1px; -} - -.notice-options .repeated:before, -.notice-options .form_repeat:not(.dialogbox):before { - content: "\f079"; -} - -.notice-options .repeated:before { - color:#609928; -} - -.notice-options .notice_delete:before { - font: 25px/1 "Genericons"; - content: "\f407"; - margin-top:-3px; -} - -.threaded-replies .notice-options .notice_delete, -.threaded-replies .notice-options .notice_reply, -.threaded-replies .notice-options .form_favor, -.threaded-replies .notice-options .form_disfavor, -.threaded-replies .notice-options .form_repeat, -.threaded-replies .notice-options .repeated { - margin-left:5px; -} - -.threaded-replies .notice-options .notice_reply:before, -.threaded-replies .notice-options .form_favor:before, -.threaded-replies .notice-options .form_disfavor:before, -.threaded-replies .notice-options .form_repeat:not(.dialogbox):before, -.threaded-replies .notice-options .repeated:before { - font: 17px/1 "fa"; -} - -.threaded-replies .notice-options .notice_delete:before { - font: 22px/1 "Genericons"; - margin-top:-2px; - margin-left:-2px; -} - -#content .threaded-notices .threaded-replies .notice-options form:not(.dialogbox) input, -#content .threaded-notices .threaded-replies .notice-options a, -#content .notices .threaded-replies .notice-options form:not(.dialogbox) input, -#content .notices .threaded-replies .notice-options a, -#content .notices .threaded-replies .notice-options span { - height:20px; - width:20px; -} - -.notice-options .notice_delete:before, -.notice-options .notice_reply:before, -.notice-options .form_favor:before, -.notice-options .form_disfavor:before, -.notice-options .form_repeat:before, -.notice-options .repeated:before { - opacity:0.3; - transition:opacity 0.3s; -} - -.notice:hover > .notice-options .notice_delete:before, -.notice:hover > .notice-options .notice_reply:before, -.notice:hover > .notice-options .form_favor:before, -.notice:hover > .notice-options .form_disfavor:before, -.notice:hover > .notice-options .form_repeat:before, -.notice:hover > .notice-options .repeated:before { - opacity:1; -} - - - - -#showstream .entry-metadata .repeat { - background-image:none; -/* background-position: -1px -1642px; */ - color: transparent; - display: block; - font-size: 0; - height: 30px; - left: -65px; -/* overflow: hidden; */ - position: absolute; - top: -35px; - width: 30px; -} - -#showstream .entry-metadata .repeat:before { - content: "\f079"; - background-color: #609928; - border-radius: 25px; - box-sizing: border-box; - color: #fff; - display: block; - font-family: "fa"; - font-size: 14px; - height: 25px; - left: 0px; - line-height: 25px; - position: absolute; - text-align: center; - text-indent: 0; - top: 2px; - width: 25px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - box-shadow:1px 1px 5px rgba(255,255,255,0.5); -} - -#notices_primary .notices:not(.threaded-notices) .repeat.h-entry { - display:none; -} - /* loading */ + #infscr-loading { font-size:20px; color: rgba(0,0,0,0.4); @@ -2021,157 +1445,141 @@ ul.messages .notice .p-author { #nav_profile a:before { content: "\f304"; margin-top:-1px; - } +} + #nav_timeline_replies a:before { content: "\f086"; font-family:'fa'; font-size:14px; margin-left:-19px; - } +} + #nav_local_default li:first-child ul.nav li:nth-child(4) a:before { content: "\f0e0"; font-family:'fa'; font-size:12px; margin-left:-18px; - } +} + #nav_timeline_favorites a:before { content: "\f005"; font-family:'fa'; font-size:14px; margin-left:-18px; - } +} + #nav_timeline_public a:before { content: "\f475"; - } +} + #nav_groups a:before { content: "\f0c0"; font-family:'fa'; font-size:12px; margin-left:-18px; - } +} + #nav_recent-tags a:before { content: "\f02c"; font-family:'fa'; font-size:12px; margin-left:-18px; - } +} + #nav_timeline_favorited a:before { content: "\f140"; font-family:'fa'; font-size:14px; margin-left:-17px; - } +} + #nav_directory a:before { content: "\f1ae"; font-family: "fa"; font-size: 15px; margin-left: -16px; margin-top: -1px; - } +} + #nav_lists a:before { content: "\f0c9"; font-family: "fa"; font-size: 15px; margin-left: -18px; - } +} -.form_group_join, -.form_group_leave, -.form_group_delete { - position:relative; - } -.entity_edit a, -.entity_remote_subscribe, -#export_data a, -.peopletags_edit_button, -.form_group_join input.submit, -.form_group_leave input.submit, -.form_group_delete input.submit { - background-image:none !important; - } -.entity_edit a:before, -.entity_remote_subscribe:before, -#export_data a:before, -.peopletags_edit_button:before, -.form_group_join:before, -.form_group_leave:before, -.form_group_delete:before { - content: "\f14b"; - display: inline; - font-family:'fa'; - font-size:18px; - line-height:20px; - position:absolute; - display:block; - box-sizing:border-box; - height:20px; - width:20px; - margin-left:-22px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color:rgba(0,0,0,0.6); - } -.entity_edit a:hover:before, -.entity_remote_subscribe:hover:before, -.peopletags_edit_button:hover:before, -.form_group_join:hover:before, -.form_group_leave:hover:before, -.form_group_delete:hover:before { - color:rgba(0,0,0,0.8); - } -.entity_remote_subscribe:before { - content: "\f0fe"; - } -#export_data a:before { - content: "\f143"; - margin-left: -25px; - margin-top: -2px; - } -#export_data a { - padding-left:25px !important; - } -#export_data a:hover:before { - color:#ff6600; - } + +.profile_list td.entity_actions { + width: 24px; + max-width: 24px; + min-width: 24px; + height: 20px; + padding-left: 6px !important; + position: relative; + float: none; + display: table-cell !important; +} + +.profile_list .entity_actions ul { + position: absolute; + right: 20px; +} + +.profile_list .entity_actions input { + width: 22px; + height: 22px; + padding-top: 1px; + padding-right: 0px; + padding-left: 20px; + display: block; + overflow: hidden; + font-size: 0em; + border: 1px solid #CDD1DD; +} + +.profile_list .form_group_leave input.submit, +.profile_list .form_user_unsubscribe input.submit { + background-position: 2px -1250px; +} + +.profile_list .form_group_join input.submit, +.profile_list .form_user_subscribe input.submit { + background-position: 2px -1184px; +} + +.profile_list .entity_actions input:hover { + width: auto; + padding-right: 10px; + overflow: visible; + font-size: 1em; + line-height: 1.3em; + border: 1px solid #A6ADBF; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); +} .peopletags_edit_button { position:relative; - } +} .peopletags_edit_button:before { margin-left: -2px; top: -2px; - } - -.form_group_join:before, -.form_group_leave:before, -.form_group_delete:before { - content: "\f0fe"; - margin-left:4px; - top:4px; - } -.form_group_leave:before { - content: "\f146"; - } -.form_group_delete:before { - content: "\f071"; - } - +} #export_data li a.foaf, #export_data li a.json, #export_data li:nth-child(2) { display:none; - } +} .group_profile_block .entity_actions li a, .group_profile_block .entity_actions input.submit { background-color:transparent !important; - } - - +} #gnusocial-version { border: 1px solid rgba(0, 0, 0, 0.3); @@ -2181,13 +1589,13 @@ border: 1px solid rgba(0, 0, 0, 0.3); font-size: 11px; padding: 15px; width: 100%; - } +} + #gnusocial-version a, #gnusocial-version p { margin:0; color:rgba(0,0,0,0.5); - } - +} .form_notice input.submit, .form_settings input.submit, .form_settings input.cancel, #form_invite input.submit, .entity_subscribe .dialogbox input.submit_dialogbox, @@ -2241,17 +1649,11 @@ border: 1px solid rgba(0, 0, 0, 0.3); .entity_tag .dialogbox input.submit_dialogbox:hover, .form_repeat.dialogbox input.submit_dialogbox:hover { - background: -moz-linear-gradient(top, #2daddc 0%, #0271bf 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2daddc), color-stop(100%,#0271bf)); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #2daddc 0%,#0271bf 100%); /* IE10+ */ - background: linear-gradient(to bottom, #2daddc 0%,#0271bf 100%); /* W3C */ background-repeat: repeat-x; border-color:#096eb3; @@ -2345,24 +1747,28 @@ border: 1px solid rgba(0, 0, 0, 0.3); } #content thead th { -text-align:left; + text-align:left; } + #content tbody th { -vertical-align:top; -text-align:left; -font-weight:normal; -padding-top:11px; -padding-right:18px; + vertical-align:top; + text-align:left; + font-weight:normal; + padding-top:11px; + padding-right:18px; } + #content tbody tr { border-top: 1px dotted #bbb; } + #content td { -padding:11px 18px 11px 0; -vertical-align:top; + padding:11px 18px 11px 0; + vertical-align:top; } + #content td:last-child { -padding-right:0; + padding-right:0; } /* Search */ @@ -2594,20 +2000,20 @@ table.profile_list { } .profile_list th.current { - background: none !important; + background: none !important; } .profile_list th.current.reverse { - background: none !important; + background: none !important; } .profile_list th.current a { - padding-right: 25px; - background: url(../images/bluearrow_down.png) no-repeat top right; + padding-right: 25px; + background: url(../images/bluearrow_down.png) no-repeat top right; } .profile_list th.current.reverse a { - background: url(../images/bluearrow_up.png) no-repeat top right; + background: url(../images/bluearrow_up.png) no-repeat top right; } table.profile_list tr.alt { From 2f86cd860231f92213950d439e9a109b7a5f11c4 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 12 Feb 2015 18:18:55 +0100 Subject: [PATCH 003/159] utf8mb4 conversion on database with index adjusts --- classes/Attention.php | 4 +- classes/Avatar.php | 8 ++-- classes/Config.php | 4 +- classes/Confirm_address.php | 8 ++-- classes/Consumer.php | 8 ++-- classes/Conversation.php | 4 +- classes/Deleted_notice.php | 4 +- classes/File.php | 14 +++---- classes/File_redirection.php | 4 +- classes/File_thumbnail.php | 8 ++-- classes/Foreign_link.php | 4 +- classes/Foreign_service.php | 4 +- classes/Foreign_user.php | 8 ++-- classes/Group_member.php | 4 +- classes/Invitation.php | 4 +- classes/Location_namespace.php | 4 +- classes/Memcached_DataObject.php | 6 +-- classes/Nonce.php | 4 +- classes/Notice.php | 16 ++++---- classes/Notice_source.php | 8 ++-- classes/Oauth_application.php | 40 +++++++++---------- classes/Oauth_application_user.php | 4 +- classes/Oauth_token_association.php | 4 +- classes/Profile.php | 16 ++++---- classes/Profile_list.php | 8 ++-- classes/Profile_prefs.php | 8 ++-- classes/Sms_carrier.php | 4 +- classes/Status_network.php | 18 ++++----- classes/Subscription.php | 12 +++--- classes/Token.php | 12 +++--- classes/User.php | 20 +++++----- classes/User_group.php | 36 ++++++++--------- classes/User_im_prefs.php | 8 ++-- classes/User_username.php | 8 ++-- db/site.sql | 4 +- extlib/DB.php | 1 + lib/event.php | 5 +++ lib/mysqlschema.php | 9 +++-- .../Blacklist/classes/Homepage_blacklist.php | 4 +- .../Blacklist/classes/Nickname_blacklist.php | 4 +- plugins/Blog/classes/Blog_entry.php | 12 +++--- plugins/Bookmark/classes/Bookmark.php | 12 +++--- plugins/DirectMessage/classes/Message.php | 8 ++-- .../EmailReminder/classes/Email_reminder.php | 8 ++-- plugins/Event/classes/Happening.php | 16 ++++---- plugins/Event/classes/RSVP.php | 4 +- .../FacebookBridge/classes/Notice_to_item.php | 4 +- plugins/Favorite/classes/Fave.php | 4 +- plugins/GNUsocialPhoto/classes/Photo.php | 14 +++---- .../classes/gnusocialphoto.php | 12 +++--- .../classes/gnusocialphotoalbum.php | 4 +- .../GNUsocialProfileExtensionField.php | 8 ++-- plugins/GNUsocialVideo/classes/Video.php | 8 ++-- .../classes/Group_message.php | 8 ++-- plugins/NoticeTitle/classes/Notice_title.php | 4 +- plugins/OStatus/classes/FeedSub.php | 4 +- plugins/OStatus/classes/HubSub.php | 8 ++-- plugins/OStatus/classes/Ostatus_profile.php | 10 ++--- plugins/OStatus/classes/Ostatus_source.php | 2 +- plugins/Oembed/classes/File_oembed.php | 16 ++++---- plugins/OpenID/classes/User_openid.php | 8 ++-- .../OpenID/classes/User_openid_trustroot.php | 4 +- plugins/Poll/classes/Poll.php | 4 +- plugins/Poll/classes/Poll_response.php | 4 +- plugins/QnA/classes/QnA_Answer.php | 4 +- plugins/QnA/classes/QnA_Question.php | 4 +- plugins/Realtime/classes/Realtime_channel.php | 12 +++--- .../classes/Twitter_synch_status.php | 4 +- 68 files changed, 285 insertions(+), 278 deletions(-) diff --git a/classes/Attention.php b/classes/Attention.php index ef0dcb1df7..c15a118e12 100644 --- a/classes/Attention.php +++ b/classes/Attention.php @@ -22,7 +22,7 @@ class Attention extends Managed_DataObject public $__table = 'attention'; // table name public $notice_id; // int(4) primary_key not_null public $profile_id; // int(4) primary_key not_null - public $reason; // varchar(255) + public $reason; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -33,7 +33,7 @@ class Attention extends Managed_DataObject 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice_id to give attention'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile_id for feed receiver'), - 'reason' => array('type' => 'varchar', 'length' => 255, 'description' => 'Optional reason why this was brought to the attention of profile_id'), + 'reason' => array('type' => 'varchar', 'length' => 191, 'description' => 'Optional reason why this was brought to the attention of profile_id'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Avatar.php b/classes/Avatar.php index 55abc81b33..3b3317b3ef 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -15,8 +15,8 @@ class Avatar extends Managed_DataObject public $width; // int(4) primary_key not_null public $height; // int(4) primary_key not_null public $mediatype; // varchar(32) not_null - public $filename; // varchar(255) - public $url; // varchar(255) unique_key + public $filename; // varchar(191) not 255 because utf8mb4 takes more space + public $url; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -32,8 +32,8 @@ class Avatar extends Managed_DataObject 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'), 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'), 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'local filename, if local'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'avatar location'), + 'filename' => array('type' => 'varchar', 'length' => 191, 'description' => 'local filename, if local'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'avatar location'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Config.php b/classes/Config.php index 899396d710..2e8492849c 100644 --- a/classes/Config.php +++ b/classes/Config.php @@ -35,7 +35,7 @@ class Config extends Managed_DataObject public $__table = 'config'; // table name public $section; // varchar(32) primary_key not_null public $setting; // varchar(32) primary_key not_null - public $value; // varchar(255) + public $value; // varchar(191) not 255 because utf8mb4 takes more space /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE @@ -46,7 +46,7 @@ class Config extends Managed_DataObject 'fields' => array( 'section' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration section'), 'setting' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'default' => '', 'description' => 'configuration setting'), - 'value' => array('type' => 'varchar', 'length' => 255, 'description' => 'configuration value'), + 'value' => array('type' => 'varchar', 'length' => 191, 'description' => 'configuration value'), ), 'primary key' => array('section', 'setting'), ); diff --git a/classes/Confirm_address.php b/classes/Confirm_address.php index 0ed7796ad4..91a84feb77 100644 --- a/classes/Confirm_address.php +++ b/classes/Confirm_address.php @@ -12,8 +12,8 @@ class Confirm_address extends Managed_DataObject public $__table = 'confirm_address'; // table name public $code; // varchar(32) primary_key not_null public $user_id; // int(4) not_null - public $address; // varchar(255) not_null - public $address_extra; // varchar(255) not_null + public $address; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $address_extra; // varchar(191) not_null not 255 because utf8mb4 takes more space public $address_type; // varchar(8) not_null public $claimed; // datetime() public $sent; // datetime() @@ -28,8 +28,8 @@ class Confirm_address extends Managed_DataObject 'fields' => array( 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'good random code'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who requested confirmation'), - 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'), - 'address_extra' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'carrier ID, for SMS'), + 'address' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'address (email, xmpp, SMS, etc.)'), + 'address_extra' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'carrier ID, for SMS'), 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), 'claimed' => array('type' => 'datetime', 'description' => 'date this was claimed for queueing'), 'sent' => array('type' => 'datetime', 'description' => 'date this was sent for queueing'), diff --git a/classes/Consumer.php b/classes/Consumer.php index 68e973bfb0..4121938ed8 100644 --- a/classes/Consumer.php +++ b/classes/Consumer.php @@ -10,8 +10,8 @@ class Consumer extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'consumer'; // table name - public $consumer_key; // varchar(255) primary_key not_null - public $consumer_secret; // varchar(255) not_null + public $consumer_key; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space + public $consumer_secret; // varchar(191) not_null not 255 because utf8mb4 takes more space public $seed; // char(32) not_null public $created; // datetime not_null public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -24,8 +24,8 @@ class Consumer extends Managed_DataObject return array( 'description' => 'OAuth consumer record', 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), - 'consumer_secret' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'secret value'), + 'consumer_key' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'consumer_secret' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'secret value'), 'seed' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'seed for new tokens by this consumer'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), diff --git a/classes/Conversation.php b/classes/Conversation.php index 56f61c63ab..343668cc49 100644 --- a/classes/Conversation.php +++ b/classes/Conversation.php @@ -35,7 +35,7 @@ class Conversation extends Managed_DataObject { public $__table = 'conversation'; // table name public $id; // int(4) primary_key not_null - public $uri; // varchar(255) unique_key + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $created; // datetime not_null public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -44,7 +44,7 @@ class Conversation extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'should be set from root notice id (since 2014-03-01 commit)'), - 'uri' => array('type' => 'varchar', 'not null'=>true, 'length' => 255, 'description' => 'URI of the conversation'), + 'uri' => array('type' => 'varchar', 'not null'=>true, 'length' => 191, 'description' => 'URI of the conversation'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Deleted_notice.php b/classes/Deleted_notice.php index 4c17be185a..a9167f19a4 100644 --- a/classes/Deleted_notice.php +++ b/classes/Deleted_notice.php @@ -34,7 +34,7 @@ class Deleted_notice extends Managed_DataObject public $__table = 'deleted_notice'; // table name public $id; // int(4) primary_key not_null public $profile_id; // int(4) not_null - public $uri; // varchar(255) unique_key + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $deleted; // datetime() not_null @@ -47,7 +47,7 @@ class Deleted_notice extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity of notice'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'author of the notice'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), 'deleted' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the notice record was created'), ), diff --git a/classes/File.php b/classes/File.php index ce2f940161..b42e1a674f 100644 --- a/classes/File.php +++ b/classes/File.php @@ -26,13 +26,13 @@ class File extends Managed_DataObject { public $__table = 'file'; // table name public $id; // int(4) primary_key not_null - public $url; // varchar(255) unique_key + public $url; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $mimetype; // varchar(50) public $size; // int(4) - public $title; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $date; // int(4) public $protected; // int(4) - public $filename; // varchar(255) + public $filename; // varchar(191) not 255 because utf8mb4 takes more space public $width; // int(4) public $height; // int(4) public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -42,13 +42,13 @@ class File extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'destination URL after following redirections'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'destination URL after following redirections'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'size' => array('type' => 'int', 'description' => 'size of resource when available'), - 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of resource when available'), + 'title' => array('type' => 'varchar', 'length' => 191, 'description' => 'title of resource when available'), 'date' => array('type' => 'int', 'description' => 'date of resource according to http query'), 'protected' => array('type' => 'int', 'description' => 'true when URL is private (needs login)'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if a local file, name of the file'), + 'filename' => array('type' => 'varchar', 'length' => 191, 'description' => 'if a local file, name of the file'), 'width' => array('type' => 'int', 'description' => 'width in pixels, if it can be described as such and data is available'), 'height' => array('type' => 'int', 'description' => 'height in pixels, if it can be described as such and data is available'), @@ -152,7 +152,7 @@ class File extends Managed_DataObject } // TODO: max field length - if ($redir_url === $given_url || strlen($redir_url) > 255 || !$followRedirects) { + if ($redir_url === $given_url || strlen($redir_url) > 191 || !$followRedirects) { // Save the File object based on our lookup trace $file = File::saveNew($redir_data, $given_url); } else { diff --git a/classes/File_redirection.php b/classes/File_redirection.php index 0bcccc6cff..d78dc66385 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -29,7 +29,7 @@ class File_redirection extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'file_redirection'; // table name - public $url; // varchar(255) primary_key not_null + public $url; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $file_id; // int(4) public $redirections; // int(4) public $httpcode; // int(4) @@ -42,7 +42,7 @@ class File_redirection extends Managed_DataObject { return array( 'fields' => array( - 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'short URL (or any other kind of redirect) for file (id)'), + 'url' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'short URL (or any other kind of redirect) for file (id)'), 'file_id' => array('type' => 'int', 'description' => 'short URL for what URL/file'), 'redirections' => array('type' => 'int', 'description' => 'redirect count'), 'httpcode' => array('type' => 'int', 'description' => 'HTTP status code (20x, 30x, etc.)'), diff --git a/classes/File_thumbnail.php b/classes/File_thumbnail.php index 6a92b07d0c..af3551028e 100644 --- a/classes/File_thumbnail.php +++ b/classes/File_thumbnail.php @@ -27,8 +27,8 @@ class File_thumbnail extends Managed_DataObject { public $__table = 'file_thumbnail'; // table name public $file_id; // int(4) primary_key not_null - public $url; // varchar(255) unique_key - public $filename; // varchar(255) + public $url; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $filename; // varchar(191) not 255 because utf8mb4 takes more space public $width; // int(4) primary_key public $height; // int(4) primary_key public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -38,8 +38,8 @@ class File_thumbnail extends Managed_DataObject return array( 'fields' => array( 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'thumbnail for what URL/file'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of thumbnail'), - 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if stored locally, filename is put here'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL of thumbnail'), + 'filename' => array('type' => 'varchar', 'length' => 191, 'description' => 'if stored locally, filename is put here'), 'width' => array('type' => 'int', 'description' => 'width of thumbnail'), 'height' => array('type' => 'int', 'description' => 'height of thumbnail'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index a964d87fdd..6176ec43bc 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -13,7 +13,7 @@ class Foreign_link extends Managed_DataObject public $user_id; // int(4) primary_key not_null public $foreign_id; // bigint(8) primary_key not_null unsigned public $service; // int(4) primary_key not_null - public $credentials; // varchar(255) + public $credentials; // varchar(191) not 255 because utf8mb4 takes more space public $noticesync; // tinyint(1) not_null default_1 public $friendsync; // tinyint(1) not_null default_2 public $profilesync; // tinyint(1) not_null default_1 @@ -32,7 +32,7 @@ class Foreign_link extends Managed_DataObject 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'link to user on this system, if exists'), 'foreign_id' => array('type' => 'int', 'size' => 'big', 'unsigned' => true, 'not null' => true, 'description' => 'link to user on foreign service, if exists'), 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), - 'credentials' => array('type' => 'varchar', 'length' => 255, 'description' => 'authc credentials, typically a password'), + 'credentials' => array('type' => 'varchar', 'length' => 191, 'description' => 'authc credentials, typically a password'), 'noticesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies'), 'friendsync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 2, 'description' => 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), 'profilesync' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming'), diff --git a/classes/Foreign_service.php b/classes/Foreign_service.php index df9fd5825d..78c1c0cee5 100644 --- a/classes/Foreign_service.php +++ b/classes/Foreign_service.php @@ -12,7 +12,7 @@ class Foreign_service extends Managed_DataObject public $__table = 'foreign_service'; // table name public $id; // int(4) primary_key not_null public $name; // varchar(32) unique_key not_null - public $description; // varchar(255) + public $description; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -25,7 +25,7 @@ class Foreign_service extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'numeric key for service'), 'name' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'name of the service'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description'), + 'description' => array('type' => 'varchar', 'length' => 191, 'description' => 'description'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Foreign_user.php b/classes/Foreign_user.php index eeaf817876..c1739d318a 100644 --- a/classes/Foreign_user.php +++ b/classes/Foreign_user.php @@ -12,8 +12,8 @@ class Foreign_user extends Managed_DataObject public $__table = 'foreign_user'; // table name public $id; // bigint(8) primary_key not_null public $service; // int(4) primary_key not_null - public $uri; // varchar(255) unique_key not_null - public $nickname; // varchar(255) + public $uri; // varchar(191) unique_key not_null not 255 because utf8mb4 takes more space + public $nickname; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -26,8 +26,8 @@ class Foreign_user extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'unique numeric key on foreign service'), 'service' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to service'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'identifying URI'), - 'nickname' => array('type' => 'varchar', 'length' => 255, 'description' => 'nickname on foreign service'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'identifying URI'), + 'nickname' => array('type' => 'varchar', 'length' => 191, 'description' => 'nickname on foreign service'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Group_member.php b/classes/Group_member.php index 14f417758d..392440222b 100644 --- a/classes/Group_member.php +++ b/classes/Group_member.php @@ -12,7 +12,7 @@ class Group_member extends Managed_DataObject public $group_id; // int(4) primary_key not_null public $profile_id; // int(4) primary_key not_null public $is_admin; // tinyint(1) - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -26,7 +26,7 @@ class Group_member extends Managed_DataObject 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), 'is_admin' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this user an admin?'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universal identifier'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Invitation.php b/classes/Invitation.php index a40bd0f330..ca03bb7aa1 100644 --- a/classes/Invitation.php +++ b/classes/Invitation.php @@ -12,7 +12,7 @@ class Invitation extends Managed_DataObject public $__table = 'invitation'; // table name public $code; // varchar(32) primary_key not_null public $user_id; // int(4) not_null - public $address; // varchar(255) multiple_key not_null + public $address; // varchar(191) multiple_key not_null not 255 because utf8mb4 takes more space public $address_type; // varchar(8) multiple_key not_null public $registered_user_id; // int(4) not_null public $created; // datetime() not_null @@ -34,7 +34,7 @@ class Invitation extends Managed_DataObject 'fields' => array( 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'random code for an invitation'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'who sent the invitation'), - 'address' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'invitation sent to'), + 'address' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'invitation sent to'), 'address_type' => array('type' => 'varchar', 'length' => 8, 'not null' => true, 'description' => 'address type ("email", "xmpp", "sms")'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'registered_user_id' => array('type' => 'int', 'not null' => false, 'description' => 'if the invitation is converted, who the new user is'), diff --git a/classes/Location_namespace.php b/classes/Location_namespace.php index 3690ecc044..a841473953 100644 --- a/classes/Location_namespace.php +++ b/classes/Location_namespace.php @@ -32,7 +32,7 @@ class Location_namespace extends Managed_DataObject public $__table = 'location_namespace'; // table name public $id; // int(4) primary_key not_null - public $description; // varchar(255) + public $description; // varchar(191) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -44,7 +44,7 @@ class Location_namespace extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'identity for this namespace'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the namespace'), + 'description' => array('type' => 'varchar', 'length' => 191, 'description' => 'description of the namespace'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date the record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 2bd9581cf6..3f1945205a 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -734,7 +734,7 @@ class Memcached_DataObject extends Safe_DataObject return $string; } - // We overload so that 'SET NAMES "utf8"' is called for + // We overload so that 'SET NAMES "utf8mb4"' is called for // each connection function _connect() @@ -784,9 +784,9 @@ class Memcached_DataObject extends Safe_DataObject $conn = $DB->connection; if (!empty($conn)) { if ($DB instanceof DB_mysqli || $DB instanceof MDB2_Driver_mysqli) { - mysqli_set_charset($conn, 'utf8'); + mysqli_set_charset($conn, 'utf8mb4'); } else if ($DB instanceof DB_mysql || $DB instanceof MDB2_Driver_mysql) { - mysql_set_charset('utf8', $conn); + mysql_set_charset('utf8mb4', $conn); } } } diff --git a/classes/Nonce.php b/classes/Nonce.php index 9d8dfece04..d37aade4a8 100644 --- a/classes/Nonce.php +++ b/classes/Nonce.php @@ -10,7 +10,7 @@ class Nonce extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'nonce'; // table name - public $consumer_key; // varchar(255) primary_key not_null + public $consumer_key; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $tok; // char(32) public $nonce; // char(32) primary_key not_null public $ts; // datetime() primary_key not_null @@ -39,7 +39,7 @@ class Nonce extends Managed_DataObject return array( 'description' => 'OAuth nonce record', 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'consumer_key' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'unique identifier, root URL'), 'tok' => array('type' => 'char', 'length' => 32, 'description' => 'buggy old value, ignored'), 'nonce' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'nonce'), 'ts' => array('type' => 'datetime', 'not null' => true, 'description' => 'timestamp sent'), diff --git a/classes/Notice.php b/classes/Notice.php index a69efc45ae..3b03069f13 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -55,10 +55,10 @@ class Notice extends Managed_DataObject public $__table = 'notice'; // table name public $id; // int(4) primary_key not_null public $profile_id; // int(4) multiple_key not_null - public $uri; // varchar(255) unique_key + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $content; // text public $rendered; // text - public $url; // varchar(255) + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime multiple_key not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP public $reply_to; // int(4) @@ -70,8 +70,8 @@ class Notice extends Managed_DataObject public $location_id; // int(4) public $location_ns; // int(4) public $repeat_of; // int(4) - public $verb; // varchar(255) - public $object_type; // varchar(255) + public $verb; // varchar(191) not 255 because utf8mb4 takes more space + public $object_type; // varchar(191) not 255 because utf8mb4 takes more space public $scope; // int(4) /* the code above is auto generated do not remove the tag below */ @@ -83,10 +83,10 @@ class Notice extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'who made the update'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), 'content' => array('type' => 'text', 'description' => 'update content', 'collate' => 'utf8_general_ci'), 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), 'reply_to' => array('type' => 'int', 'description' => 'notice replied to (usually a guess)'), @@ -98,8 +98,8 @@ class Notice extends Managed_DataObject 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), 'location_ns' => array('type' => 'int', 'description' => 'namespace for location'), 'repeat_of' => array('type' => 'int', 'description' => 'notice this is a repeat of'), - 'object_type' => array('type' => 'varchar', 'length' => 255, 'description' => 'URI representing activity streams object type', 'default' => 'http://activitystrea.ms/schema/1.0/note'), - 'verb' => array('type' => 'varchar', 'length' => 255, 'description' => 'URI representing activity streams verb', 'default' => 'http://activitystrea.ms/schema/1.0/post'), + 'object_type' => array('type' => 'varchar', 'length' => 191, 'description' => 'URI representing activity streams object type', 'default' => 'http://activitystrea.ms/schema/1.0/note'), + 'verb' => array('type' => 'varchar', 'length' => 191, 'description' => 'URI representing activity streams verb', 'default' => 'http://activitystrea.ms/schema/1.0/post'), 'scope' => array('type' => 'int', 'description' => 'bit map for distribution scope; 0 = everywhere; 1 = this server only; 2 = addressees; 4 = followers; null = default'), ), diff --git a/classes/Notice_source.php b/classes/Notice_source.php index 6f3d2e5634..f31d4411ff 100644 --- a/classes/Notice_source.php +++ b/classes/Notice_source.php @@ -11,8 +11,8 @@ class Notice_source extends Managed_DataObject public $__table = 'notice_source'; // table name public $code; // varchar(32) primary_key not_null - public $name; // varchar(255) not_null - public $url; // varchar(255) not_null + public $name; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $url; // varchar(191) not_null not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -24,8 +24,8 @@ class Notice_source extends Managed_DataObject return array( 'fields' => array( 'code' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'source code'), - 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the source'), - 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'url to link to'), + 'name' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'name of the source'), + 'url' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'url to link to'), 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'date this record was created'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/classes/Oauth_application.php b/classes/Oauth_application.php index b29fdfe41b..9cf3f5e108 100644 --- a/classes/Oauth_application.php +++ b/classes/Oauth_application.php @@ -12,14 +12,14 @@ class Oauth_application extends Managed_DataObject public $__table = 'oauth_application'; // table name public $id; // int(4) primary_key not_null public $owner; // int(4) not_null - public $consumer_key; // varchar(255) not_null - public $name; // varchar(255) not_null - public $description; // varchar(255) - public $icon; // varchar(255) not_null - public $source_url; // varchar(255) - public $organization; // varchar(255) - public $homepage; // varchar(255) - public $callback_url; // varchar(255) not_null + public $consumer_key; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $name; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $description; // varchar(191) not 255 because utf8mb4 takes more space + public $icon; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $source_url; // varchar(191) not 255 because utf8mb4 takes more space + public $organization; // varchar(191) not 255 because utf8mb4 takes more space + public $homepage; // varchar(191) not 255 because utf8mb4 takes more space + public $callback_url; // varchar(191) not_null not 255 because utf8mb4 takes more space public $type; // tinyint(1) public $access_type; // tinyint(1) public $created; // datetime not_null @@ -43,12 +43,12 @@ class Oauth_application extends Managed_DataObject static function maxDesc() { // This used to default to textlimit or allow unlimited descriptions, - // but this isn't part of a notice and the field's limited to 255 chars - // in the DB, so those seem silly. + // but this isn't part of a notice and the field's limited to 191 chars + // in the DB, so those seem silly. (utf8mb4 takes up more space, so can't use 255) // - // Now just defaulting to 255 max unless a smaller application desclimit + // Now just defaulting to 191 max unless a smaller application desclimit // is actually set. Setting to 0 will use the maximum. - $max = 255; + $max = 191; $desclimit = intval(common_config('application', 'desclimit')); if ($desclimit > 0 && $desclimit < $max) { return $desclimit; @@ -163,14 +163,14 @@ class Oauth_application extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), 'owner' => array('type' => 'int', 'not null' => true, 'description' => 'owner of the application'), - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application consumer key'), - 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'name of the application'), - 'description' => array('type' => 'varchar', 'length' => 255, 'description' => 'description of the application'), - 'icon' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'application icon'), - 'source_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'application homepage - used for source link'), - 'organization' => array('type' => 'varchar', 'length' => 255, 'description' => 'name of the organization running the application'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage for the organization'), - 'callback_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'url to redirect to after authentication'), + 'consumer_key' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'application consumer key'), + 'name' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'name of the application'), + 'description' => array('type' => 'varchar', 'length' => 191, 'description' => 'description of the application'), + 'icon' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'application icon'), + 'source_url' => array('type' => 'varchar', 'length' => 191, 'description' => 'application homepage - used for source link'), + 'organization' => array('type' => 'varchar', 'length' => 191, 'description' => 'name of the organization running the application'), + 'homepage' => array('type' => 'varchar', 'length' => 191, 'description' => 'homepage for the organization'), + 'callback_url' => array('type' => 'varchar', 'length' => 191, 'description' => 'url to redirect to after authentication'), 'type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'type of app, 1 = browser, 2 = desktop'), 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'default access type, bit 1 = read, bit 2 = write'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), diff --git a/classes/Oauth_application_user.php b/classes/Oauth_application_user.php index 007e4d1db6..60b2e8fa2c 100644 --- a/classes/Oauth_application_user.php +++ b/classes/Oauth_application_user.php @@ -13,7 +13,7 @@ class Oauth_application_user extends Managed_DataObject public $profile_id; // int(4) primary_key not_null public $application_id; // int(4) primary_key not_null public $access_type; // tinyint(1) - public $token; // varchar(255) + public $token; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime not_null public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -27,7 +27,7 @@ class Oauth_application_user extends Managed_DataObject 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'user of the application'), 'application_id' => array('type' => 'int', 'not null' => true, 'description' => 'id of the application'), 'access_type' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'access type, bit 1 = read, bit 2 = write'), - 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'request or access token'), + 'token' => array('type' => 'varchar', 'length' => 191, 'description' => 'request or access token'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Oauth_token_association.php b/classes/Oauth_token_association.php index ec5eae3064..83bc0d8054 100644 --- a/classes/Oauth_token_association.php +++ b/classes/Oauth_token_association.php @@ -12,7 +12,7 @@ class Oauth_token_association extends Managed_DataObject public $__table = 'oauth_token_association'; // table name public $profile_id; // int(4) primary_key not_null public $application_id; // int(4) primary_key not_null - public $token; // varchar(255) primary key not null + public $token; // varchar(191) primary key not null not 255 because utf8mb4 takes more space public $created; // datetime not_null public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -43,7 +43,7 @@ class Oauth_token_association extends Managed_DataObject 'fields' => array( 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'associated user'), 'application_id' => array('type' => 'int', 'not null' => true, 'description' => 'the application'), - 'token' => array('type' => 'varchar', 'length' => '255', 'not null' => true, 'description' => 'token used for this association'), + 'token' => array('type' => 'varchar', 'length' => '191', 'not null' => true, 'description' => 'token used for this association'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Profile.php b/classes/Profile.php index 0b608fbb24..b1c29041df 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -30,11 +30,11 @@ class Profile extends Managed_DataObject public $__table = 'profile'; // table name public $id; // int(4) primary_key not_null public $nickname; // varchar(64) multiple_key not_null - public $fullname; // varchar(255) multiple_key - public $profileurl; // varchar(255) - public $homepage; // varchar(255) multiple_key + public $fullname; // varchar(191) multiple_key not 255 because utf8mb4 takes more space + public $profileurl; // varchar(191) not 255 because utf8mb4 takes more space + public $homepage; // varchar(191) multiple_key not 255 because utf8mb4 takes more space public $bio; // text() multiple_key - public $location; // varchar(255) multiple_key + public $location; // varchar(191) multiple_key not 255 because utf8mb4 takes more space public $lat; // decimal(10,7) public $lon; // decimal(10,7) public $location_id; // int(4) @@ -49,11 +49,11 @@ class Profile extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username', 'collate' => 'utf8_general_ci'), - 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name', 'collate' => 'utf8_general_ci'), - 'profileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'), + 'fullname' => array('type' => 'varchar', 'length' => 191, 'description' => 'display name', 'collate' => 'utf8_general_ci'), + 'profileurl' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL, cached so we dont regenerate'), + 'homepage' => array('type' => 'varchar', 'length' => 191, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'), 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8_general_ci'), - 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location', 'collate' => 'utf8_general_ci'), + 'location' => array('type' => 'varchar', 'length' => 191, 'description' => 'physical location', 'collate' => 'utf8_general_ci'), 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'), 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'), 'location_id' => array('type' => 'int', 'description' => 'location id if possible'), diff --git a/classes/Profile_list.php b/classes/Profile_list.php index 0ad8106e31..2b3d2aa5ad 100644 --- a/classes/Profile_list.php +++ b/classes/Profile_list.php @@ -43,8 +43,8 @@ class Profile_list extends Managed_DataObject public $private; // tinyint(1) public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP - public $uri; // varchar(255) unique_key - public $mainpage; // varchar(255) + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $mainpage; // varchar(191) not 255 because utf8mb4 takes more space public $tagged_count; // smallint public $subscriber_count; // smallint @@ -64,8 +64,8 @@ class Profile_list extends Managed_DataObject 'created' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was modified'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), - 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page to link to'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universal identifier'), + 'mainpage' => array('type' => 'varchar', 'length' => 191, 'description' => 'page to link to'), 'tagged_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of people tagged with this tag by this user'), 'subscriber_count' => array('type' => 'int', 'default' => 0, 'description' => 'number of subscribers to this tag'), ), diff --git a/classes/Profile_prefs.php b/classes/Profile_prefs.php index ee0fa0e27c..27034390f8 100644 --- a/classes/Profile_prefs.php +++ b/classes/Profile_prefs.php @@ -31,8 +31,8 @@ class Profile_prefs extends Managed_DataObject { public $__table = 'profile_prefs'; // table name public $profile_id; // int(4) primary_key not_null - public $namespace; // varchar(255) not_null - public $topic; // varchar(255) not_null + public $namespace; // varchar(191) not_null + public $topic; // varchar(191) not_null public $data; // text public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP @@ -42,8 +42,8 @@ class Profile_prefs extends Managed_DataObject return array( 'fields' => array( 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), - 'namespace' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'namespace, like pluginname or category'), - 'topic' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'preference key, i.e. description, age...'), + 'namespace' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'namespace, like pluginname or category'), + 'topic' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'preference key, i.e. description, age...'), 'data' => array('type' => 'blob', 'description' => 'topic data, may be anything'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/classes/Sms_carrier.php b/classes/Sms_carrier.php index 7d3a5fc0ca..d37cf42d97 100644 --- a/classes/Sms_carrier.php +++ b/classes/Sms_carrier.php @@ -12,7 +12,7 @@ class Sms_carrier extends Managed_DataObject public $__table = 'sms_carrier'; // table name public $id; // int(4) primary_key not_null public $name; // varchar(64) unique_key - public $email_pattern; // varchar(255) not_null + public $email_pattern; // varchar(191) not_null not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -30,7 +30,7 @@ class Sms_carrier extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'primary key for SMS carrier'), 'name' => array('type' => 'varchar', 'length' => 64, 'description' => 'name of the carrier'), - 'email_pattern' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'sprintf pattern for making an email address from a phone number'), + 'email_pattern' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'sprintf pattern for making an email address from a phone number'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Status_network.php b/classes/Status_network.php index ffbf9d5a3c..3498b4bd24 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -29,15 +29,15 @@ class Status_network extends Safe_DataObject public $__table = 'status_network'; // table name public $site_id; // int(4) primary_key not_null public $nickname; // varchar(64) unique_key not_null - public $hostname; // varchar(255) unique_key - public $pathname; // varchar(255) unique_key - public $dbhost; // varchar(255) - public $dbuser; // varchar(255) - public $dbpass; // varchar(255) - public $dbname; // varchar(255) - public $sitename; // varchar(255) - public $theme; // varchar(255) - public $logo; // varchar(255) + public $hostname; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $pathname; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $dbhost; // varchar(191) not 255 because utf8mb4 takes more space + public $dbuser; // varchar(191) not 255 because utf8mb4 takes more space + public $dbpass; // varchar(191) not 255 because utf8mb4 takes more space + public $dbname; // varchar(191) not 255 because utf8mb4 takes more space + public $sitename; // varchar(191) not 255 because utf8mb4 takes more space + public $theme; // varchar(191) not 255 because utf8mb4 takes more space + public $logo; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP diff --git a/classes/Subscription.php b/classes/Subscription.php index 4d7eb524dc..9ef19e2f66 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -32,9 +32,9 @@ class Subscription extends Managed_DataObject public $subscribed; // int(4) primary_key not_null public $jabber; // tinyint(1) default_1 public $sms; // tinyint(1) default_1 - public $token; // varchar(255) - public $secret; // varchar(255) - public $uri; // varchar(255) + public $token; // varchar(191) not 255 because utf8mb4 takes more space + public $secret; // varchar(191) not 255 because utf8mb4 takes more space + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -46,9 +46,9 @@ class Subscription extends Managed_DataObject 'subscribed' => array('type' => 'int', 'not null' => true, 'description' => 'profile being listened to'), 'jabber' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver jabber messages'), 'sms' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver sms messages'), - 'token' => array('type' => 'varchar', 'length' => 255, 'description' => 'authorization token'), - 'secret' => array('type' => 'varchar', 'length' => 255, 'description' => 'token secret'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), + 'token' => array('type' => 'varchar', 'length' => 191, 'description' => 'authorization token'), + 'secret' => array('type' => 'varchar', 'length' => 191, 'description' => 'token secret'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/classes/Token.php b/classes/Token.php index 8d8a4d1c11..89b3f4ecf1 100644 --- a/classes/Token.php +++ b/classes/Token.php @@ -10,13 +10,13 @@ class Token extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'token'; // table name - public $consumer_key; // varchar(255) primary_key not_null + public $consumer_key; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $tok; // char(32) primary_key not_null public $secret; // char(32) not_null public $type; // tinyint(1) not_null public $state; // tinyint(1) - public $verifier; // varchar(255) - public $verified_callback; // varchar(255) + public $verifier; // varchar(191) not 255 because utf8mb4 takes more space + public $verified_callback; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -27,13 +27,13 @@ class Token extends Managed_DataObject return array( 'description' => 'OAuth token record', 'fields' => array( - 'consumer_key' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'unique identifier, root URL'), + 'consumer_key' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'unique identifier, root URL'), 'tok' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'identifying value'), 'secret' => array('type' => 'char', 'length' => 32, 'not null' => true, 'description' => 'secret value'), 'type' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'request or access'), 'state' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'for requests, 0 = initial, 1 = authorized, 2 = used'), - 'verifier' => array('type' => 'varchar', 'length' => 255, 'description' => 'verifier string for OAuth 1.0a'), - 'verified_callback' => array('type' => 'varchar', 'length' => 255, 'description' => 'verified callback URL for OAuth 1.0a'), + 'verifier' => array('type' => 'varchar', 'length' => 191, 'description' => 'verifier string for OAuth 1.0a'), + 'verified_callback' => array('type' => 'varchar', 'length' => 191, 'description' => 'verified callback URL for OAuth 1.0a'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/classes/User.php b/classes/User.php index 7a19ae3a0a..a719bec8ef 100644 --- a/classes/User.php +++ b/classes/User.php @@ -34,9 +34,9 @@ class User extends Managed_DataObject public $__table = 'user'; // table name public $id; // int(4) primary_key not_null public $nickname; // varchar(64) unique_key - public $password; // varchar(255) - public $email; // varchar(255) unique_key - public $incomingemail; // varchar(255) unique_key + public $password; // varchar(191) not 255 because utf8mb4 takes more space + public $email; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $incomingemail; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $emailnotifysub; // tinyint(1) default_1 public $emailnotifyfav; // tinyint(1) default_1 public $emailnotifynudge; // tinyint(1) default_1 @@ -50,8 +50,8 @@ class User extends Managed_DataObject public $carrier; // int(4) public $smsnotify; // tinyint(1) public $smsreplies; // tinyint(1) - public $smsemail; // varchar(255) - public $uri; // varchar(255) unique_key + public $smsemail; // varchar(191) not 255 because utf8mb4 takes more space + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $autosubscribe; // tinyint(1) public $subscribe_policy; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca @@ -69,9 +69,9 @@ class User extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname or username, duped in profile'), - 'password' => array('type' => 'varchar', 'length' => 255, 'description' => 'salted password, can be null for OpenID users'), - 'email' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for password recovery etc.'), - 'incomingemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for post-by-email'), + 'password' => array('type' => 'varchar', 'length' => 191, 'description' => 'salted password, can be null for OpenID users'), + 'email' => array('type' => 'varchar', 'length' => 191, 'description' => 'email address for password recovery etc.'), + 'incomingemail' => array('type' => 'varchar', 'length' => 191, 'description' => 'email address for post-by-email'), 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => null, 'description' => 'Notify by email of favorites'), 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), @@ -85,8 +85,8 @@ class User extends Managed_DataObject 'carrier' => array('type' => 'int', 'description' => 'foreign key to sms_carrier'), 'smsnotify' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS'), 'smsreplies' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS on replies'), - 'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'smsemail' => array('type' => 'varchar', 'length' => 191, 'description' => 'built from sms and carrier'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), 'autosubscribe' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), 'subscribe_policy' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => '0 = anybody can subscribe; 1 = require approval'), 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), diff --git a/classes/User_group.php b/classes/User_group.php index 875f5d650e..3dc5fd4b2d 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -15,18 +15,18 @@ class User_group extends Managed_DataObject public $__table = 'user_group'; // table name public $id; // int(4) primary_key not_null public $nickname; // varchar(64) - public $fullname; // varchar(255) - public $homepage; // varchar(255) + public $fullname; // varchar(191) not 255 because utf8mb4 takes more space + public $homepage; // varchar(191) not 255 because utf8mb4 takes more space public $description; // text - public $location; // varchar(255) - public $original_logo; // varchar(255) - public $homepage_logo; // varchar(255) - public $stream_logo; // varchar(255) - public $mini_logo; // varchar(255) + public $location; // varchar(191) not 255 because utf8mb4 takes more space + public $original_logo; // varchar(191) not 255 because utf8mb4 takes more space + public $homepage_logo; // varchar(191) not 255 because utf8mb4 takes more space + public $stream_logo; // varchar(191) not 255 because utf8mb4 takes more space + public $mini_logo; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP - public $uri; // varchar(255) unique_key - public $mainpage; // varchar(255) + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $mainpage; // varchar(191) not 255 because utf8mb4 takes more space public $join_policy; // tinyint public $force_scope; // tinyint @@ -41,21 +41,21 @@ class User_group extends Managed_DataObject 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname for addressing'), - 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name'), - 'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'), + 'fullname' => array('type' => 'varchar', 'length' => 191, 'description' => 'display name'), + 'homepage' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL, cached so we dont regenerate'), 'description' => array('type' => 'text', 'description' => 'group description'), - 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'related physical location, if any'), + 'location' => array('type' => 'varchar', 'length' => 191, 'description' => 'related physical location, if any'), - 'original_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'original size logo'), - 'homepage_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage (profile) size logo'), - 'stream_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'stream-sized logo'), - 'mini_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'mini logo'), + 'original_logo' => array('type' => 'varchar', 'length' => 191, 'description' => 'original size logo'), + 'homepage_logo' => array('type' => 'varchar', 'length' => 191, 'description' => 'homepage (profile) size logo'), + 'stream_logo' => array('type' => 'varchar', 'length' => 191, 'description' => 'stream-sized logo'), + 'mini_logo' => array('type' => 'varchar', 'length' => 191, 'description' => 'mini logo'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universal identifier'), - 'mainpage' => array('type' => 'varchar', 'length' => 255, 'description' => 'page for group info to link to'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universal identifier'), + 'mainpage' => array('type' => 'varchar', 'length' => 191, 'description' => 'page for group info to link to'), 'join_policy' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=open; 1=requires admin approval'), 'force_scope' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=never,1=sometimes,-1=always'), ), diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php index cba91ea252..16fd030bb4 100644 --- a/classes/User_im_prefs.php +++ b/classes/User_im_prefs.php @@ -36,8 +36,8 @@ class User_im_prefs extends Managed_DataObject public $__table = 'user_im_prefs'; // table name public $user_id; // int(4) primary_key not_null - public $screenname; // varchar(255) not_null - public $transport; // varchar(255) not_null + public $screenname; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $transport; // varchar(191) not_null not 255 because utf8mb4 takes more space public $notify; // tinyint(1) public $replies; // tinyint(1) public $microid; // tinyint(1) @@ -53,8 +53,8 @@ class User_im_prefs extends Managed_DataObject return array( 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), - 'screenname' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'screenname on this service'), - 'transport' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'transport (ex xmpp, aim)'), + 'screenname' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'screenname on this service'), + 'transport' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'transport (ex xmpp, aim)'), 'notify' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Notify when a new notice is sent'), 'replies' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to'), 'microid' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 1, 'description' => 'Publish a MicroID'), diff --git a/classes/User_username.php b/classes/User_username.php index b252ee3156..0173a6efc4 100644 --- a/classes/User_username.php +++ b/classes/User_username.php @@ -11,8 +11,8 @@ class User_username extends Managed_DataObject public $__table = 'user_username'; // table name public $user_id; // int(4) not_null - public $provider_name; // varchar(255) primary_key not_null - public $username; // varchar(255) primary_key not_null + public $provider_name; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space + public $username; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -23,8 +23,8 @@ class User_username extends Managed_DataObject { return array( 'fields' => array( - 'provider_name' => array('type' => 'varchar', 'length' => 255, 'description' => 'provider name'), - 'username' => array('type' => 'varchar', 'length' => 255, 'description' => 'username'), + 'provider_name' => array('type' => 'varchar', 'length' => 191, 'description' => 'provider name'), + 'username' => array('type' => 'varchar', 'length' => 191, 'description' => 'username'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice id this title relates to'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/db/site.sql b/db/site.sql index c630a83d52..5e9693f5f7 100644 --- a/db/site.sql +++ b/db/site.sql @@ -21,7 +21,7 @@ create table status_network ( created datetime not null comment 'date this record was created', modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; +) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; create table status_network_tag ( site_id integer comment 'unique id', @@ -30,5 +30,5 @@ create table status_network_tag ( constraint primary key (site_id, tag), index status_network_tag_tag_idx (tag) -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; +) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; diff --git a/extlib/DB.php b/extlib/DB.php index a511979e67..75ed028c0c 100644 --- a/extlib/DB.php +++ b/extlib/DB.php @@ -961,6 +961,7 @@ class DB_Error extends PEAR_Error function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null) { + common_debug(var_export($debuginfo,true)); if (is_int($code)) { $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, $mode, $level, $debuginfo); diff --git a/lib/event.php b/lib/event.php index aa52fa361c..e6bb41091e 100644 --- a/lib/event.php +++ b/lib/event.php @@ -139,6 +139,11 @@ class Event { return false; } + public static function getHandlers($name) + { + return Event::$_handlers[$name]; + } + /** * Disables any and all handlers that have been set up so far; * use only if you know it's safe to reinitialize all plugins. diff --git a/lib/mysqlschema.php b/lib/mysqlschema.php index 435ba4e3a9..f1fc0f46ec 100644 --- a/lib/mysqlschema.php +++ b/lib/mysqlschema.php @@ -271,7 +271,7 @@ class MysqlSchema extends Schema function endCreateTable($name, array $def) { $engine = $this->preferredEngine($def); - return ") ENGINE=$engine CHARACTER SET utf8 COLLATE utf8_bin"; + return ") ENGINE=$engine CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"; } function preferredEngine($def) @@ -335,9 +335,10 @@ class MysqlSchema extends Schema if (strtolower($oldProps['ENGINE']) != strtolower($engine)) { $phrase[] = "ENGINE=$engine"; } - if (strtolower($oldProps['TABLE_COLLATION']) != 'utf8_bin') { - $phrase[] = 'DEFAULT CHARSET=utf8'; - $phrase[] = 'COLLATE=utf8_bin'; + if (strtolower($oldProps['TABLE_COLLATION']) != 'utf8mb4_bin') { + $phrase[] = 'CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin'; + $phrase[] = 'DEFAULT CHARACTER SET = utf8mb4'; + $phrase[] = 'DEFAULT COLLATE = utf8mb4_bin'; } } diff --git a/plugins/Blacklist/classes/Homepage_blacklist.php b/plugins/Blacklist/classes/Homepage_blacklist.php index fb2712f565..fe357941c0 100644 --- a/plugins/Blacklist/classes/Homepage_blacklist.php +++ b/plugins/Blacklist/classes/Homepage_blacklist.php @@ -47,7 +47,7 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; class Homepage_blacklist extends Managed_DataObject { public $__table = 'homepage_blacklist'; // table name - public $pattern; // varchar(255) pattern + public $pattern; // varchar(191) pattern not 255 because utf8mb4 takes more space public $created; // datetime not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -55,7 +55,7 @@ class Homepage_blacklist extends Managed_DataObject { return array( 'fields' => array( - 'pattern' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'blacklist pattern'), + 'pattern' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'blacklist pattern'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/plugins/Blacklist/classes/Nickname_blacklist.php b/plugins/Blacklist/classes/Nickname_blacklist.php index f4f387a2e0..b045fd17ce 100644 --- a/plugins/Blacklist/classes/Nickname_blacklist.php +++ b/plugins/Blacklist/classes/Nickname_blacklist.php @@ -47,7 +47,7 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; class Nickname_blacklist extends Managed_DataObject { public $__table = 'nickname_blacklist'; // table name - public $pattern; // varchar(255) pattern + public $pattern; // varchar(191) pattern not 255 because utf8mb4 takes more space public $created; // datetime not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -55,7 +55,7 @@ class Nickname_blacklist extends Managed_DataObject { return array( 'fields' => array( - 'pattern' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'blacklist pattern'), + 'pattern' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'blacklist pattern'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/plugins/Blog/classes/Blog_entry.php b/plugins/Blog/classes/Blog_entry.php index 1f585dce4f..557e50759b 100644 --- a/plugins/Blog/classes/Blog_entry.php +++ b/plugins/Blog/classes/Blog_entry.php @@ -51,11 +51,11 @@ class Blog_entry extends Managed_DataObject public $id; // UUID public $profile_id; // int - public $title; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $summary; // text public $content; // text - public $uri; // text - public $url; // text + public $uri; // varchar(191) not 255 because utf8mb4 takes more space + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime public $modified; // datetime @@ -74,17 +74,17 @@ class Blog_entry extends Managed_DataObject 'not null' => true, 'description' => 'Author profile ID'), 'title' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'description' => 'title of the entry'), 'summary' => array('type' => 'text', 'description' => 'initial summary'), 'content' => array('type' => 'text', 'description' => 'HTML content of the entry'), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'description' => 'URI (probably http://) for this entry'), 'url' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'description' => 'URL (probably http://) for this entry'), 'created' => array('type' => 'datetime', 'not null' => true, diff --git a/plugins/Bookmark/classes/Bookmark.php b/plugins/Bookmark/classes/Bookmark.php index a99df87ee3..ade6b4fa7b 100644 --- a/plugins/Bookmark/classes/Bookmark.php +++ b/plugins/Bookmark/classes/Bookmark.php @@ -47,10 +47,10 @@ class Bookmark extends Managed_DataObject public $__table = 'bookmark'; // table name public $id; // char(36) primary_key not_null public $profile_id; // int(4) not_null - public $url; // varchar(255) not_null - public $title; // varchar(255) + public $url; // varchar(191) not_null not 255 because utf8mb4 takes more space + public $title; // varchar(191) not 255 because utf8mb4 takes more space + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $description; // text - public $uri; // varchar(255) public $created; // datetime public static function schemaDef() @@ -62,12 +62,12 @@ class Bookmark extends Managed_DataObject 'not null' => true), 'profile_id' => array('type' => 'int', 'not null' => true), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'url' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), - 'title' => array('type' => 'varchar', 'length' => 255), + 'title' => array('type' => 'varchar', 'length' => 191), 'description' => array('type' => 'text'), 'created' => array('type' => 'datetime', 'not null' => true), ), diff --git a/plugins/DirectMessage/classes/Message.php b/plugins/DirectMessage/classes/Message.php index 3818a38f48..5f8d27b4f1 100644 --- a/plugins/DirectMessage/classes/Message.php +++ b/plugins/DirectMessage/classes/Message.php @@ -13,12 +13,12 @@ class Message extends Managed_DataObject public $__table = 'message'; // table name public $id; // int(4) primary_key not_null - public $uri; // varchar(255) unique_key + public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $from_profile; // int(4) not_null public $to_profile; // int(4) not_null public $content; // text() public $rendered; // text() - public $url; // varchar(255) + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP public $source; // varchar(32) @@ -31,12 +31,12 @@ class Message extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier'), 'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from'), 'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to'), 'content' => array('type' => 'text', 'description' => 'message content'), 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), 'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'), diff --git a/plugins/EmailReminder/classes/Email_reminder.php b/plugins/EmailReminder/classes/Email_reminder.php index 235305f047..7af2cdf5e6 100644 --- a/plugins/EmailReminder/classes/Email_reminder.php +++ b/plugins/EmailReminder/classes/Email_reminder.php @@ -30,8 +30,8 @@ class Email_reminder extends Managed_DataObject { public $__table = 'email_reminder'; - public $type; // type of reminder - public $code; // confirmation code + public $type; // type of reminder varchar(191) not 255 because utf8mb4 takes more space + public $code; // confirmation code varchar(191) not 255 because utf8mb4 takes more space public $days; // number of days after code was created public $sent; // timestamp public $created; // timestamp @@ -102,14 +102,14 @@ class Email_reminder extends Managed_DataObject 'fields' => array( 'type' => array( 'type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true, 'description' => 'type of reminder' ), 'code' => array( 'type' => 'varchar', 'not null' => 'true', - 'length' => 255, + 'length' => 191, 'description' => 'confirmation code' ), 'days' => array( diff --git a/plugins/Event/classes/Happening.php b/plugins/Event/classes/Happening.php index 3a094ece6c..733235655c 100644 --- a/plugins/Event/classes/Happening.php +++ b/plugins/Event/classes/Happening.php @@ -53,13 +53,13 @@ class Happening extends Managed_DataObject public $__table = 'happening'; // table name public $id; // varchar(36) UUID - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $profile_id; // int public $start_time; // datetime public $end_time; // datetime - public $title; // varchar(255) - public $location; // varchar(255) - public $url; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space + public $location; // varchar(191) not 255 because utf8mb4 takes more space + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $description; // text public $created; // datetime @@ -76,18 +76,18 @@ class Happening extends Managed_DataObject 'not null' => true, 'description' => 'UUID'), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'int', 'not null' => true), 'start_time' => array('type' => 'datetime', 'not null' => true), 'end_time' => array('type' => 'datetime', 'not null' => true), 'title' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'location' => array('type' => 'varchar', - 'length' => 255), + 'length' => 191), 'url' => array('type' => 'varchar', - 'length' => 255), + 'length' => 191), 'description' => array('type' => 'text'), 'created' => array('type' => 'datetime', 'not null' => true), diff --git a/plugins/Event/classes/RSVP.php b/plugins/Event/classes/RSVP.php index 7266ea7493..3e0efc689a 100644 --- a/plugins/Event/classes/RSVP.php +++ b/plugins/Event/classes/RSVP.php @@ -50,7 +50,7 @@ class RSVP extends Managed_DataObject public $__table = 'rsvp'; // table name public $id; // varchar(36) UUID - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $profile_id; // int public $event_id; // varchar(36) UUID public $response; // tinyint @@ -83,7 +83,7 @@ class RSVP extends Managed_DataObject 'not null' => true, 'description' => 'UUID'), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'int'), 'event_id' => array('type' => 'char', diff --git a/plugins/FacebookBridge/classes/Notice_to_item.php b/plugins/FacebookBridge/classes/Notice_to_item.php index a7cf5a13aa..1f77bb1b4f 100644 --- a/plugins/FacebookBridge/classes/Notice_to_item.php +++ b/plugins/FacebookBridge/classes/Notice_to_item.php @@ -52,7 +52,7 @@ class Notice_to_item extends Managed_DataObject { public $__table = 'notice_to_item'; // table name public $notice_id; // int(4) primary_key not_null - public $item_id; // varchar(255) not null + public $item_id; // varchar(191) not null not 255 because utf8mb4 takes more space public $created; // datetime /** @@ -76,7 +76,7 @@ class Notice_to_item extends Managed_DataObject { return array( new ColumnDef('notice_id', 'integer', null, false, 'PRI'), - new ColumnDef('item_id', 'varchar', 255, false, 'UNI'), + new ColumnDef('item_id', 'varchar', 191, false, 'UNI'), new ColumnDef('created', 'datetime', null, false) ); } diff --git a/plugins/Favorite/classes/Fave.php b/plugins/Favorite/classes/Fave.php index 68c36dfaef..094b65feaa 100644 --- a/plugins/Favorite/classes/Fave.php +++ b/plugins/Favorite/classes/Fave.php @@ -8,7 +8,7 @@ class Fave extends Managed_DataObject public $__table = 'fave'; // table name public $notice_id; // int(4) primary_key not_null public $user_id; // int(4) primary_key not_null - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space not 255 because utf8mb4 takes more space public $created; // datetime multiple_key not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -18,7 +18,7 @@ class Fave extends Managed_DataObject 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/plugins/GNUsocialPhoto/classes/Photo.php b/plugins/GNUsocialPhoto/classes/Photo.php index a6e01a8c1b..4e4ee69c97 100644 --- a/plugins/GNUsocialPhoto/classes/Photo.php +++ b/plugins/GNUsocialPhoto/classes/Photo.php @@ -39,10 +39,10 @@ class Photo extends Managed_DataObject public $__table = 'photo'; // table name public $id; // char (36) // UUID - public $uri; // varchar (255) // This is the corresponding notice's uri. - public $photo_uri; // varchar (255) - public $thumb_uri; // varchar (255) - public $title; // varchar (255) + public $uri; // varchar (191) // This is the corresponding notice's uri. not 255 because utf8mb4 takes more space + public $photo_uri; // varchar (191) not 255 because utf8mb4 takes more space + public $thumb_uri; // varchar (191) not 255 because utf8mb4 takes more space + public $title; // varchar (191) not 255 because utf8mb4 takes more space public $description; // text public $profile_id; // int @@ -66,13 +66,13 @@ class Photo extends Managed_DataObject 'not null' => true, 'description' => 'UUID'), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'photo_uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'photo_uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'int', 'not null' => true), ), diff --git a/plugins/GNUsocialPhotos/classes/gnusocialphoto.php b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php index 4f4e5fbfe4..5b14e006da 100644 --- a/plugins/GNUsocialPhotos/classes/gnusocialphoto.php +++ b/plugins/GNUsocialPhotos/classes/gnusocialphoto.php @@ -38,9 +38,9 @@ class GNUsocialPhoto extends Managed_DataObject public $id; // int(11) public $notice_id; // int(11) public $album_id; // int(11) - public $uri; // varchar(255) - public $thumb_uri; // varchar(255) - public $title; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space + public $thumb_uri; // varchar(191) not 255 because utf8mb4 takes more space + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $photo_description; // text public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -63,9 +63,9 @@ class GNUsocialPhoto extends Managed_DataObject 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'Unique ID for Photo'), 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'Notice ID for the related notice'), 'album_id' => array('type' => 'int', 'not null' => true, 'description' => 'The parent album ID'), - 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'unique address for this photo'), - 'thumb_uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'unique address for this photo thumbnail'), - 'title' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'The Photo title'), + 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'unique address for this photo'), + 'thumb_uri' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'unique address for this photo thumbnail'), + 'title' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'The Photo title'), 'photo_description' => array('type' => 'text', 'not null' => true, 'description' => 'A description for this photo'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/plugins/GNUsocialPhotos/classes/gnusocialphotoalbum.php b/plugins/GNUsocialPhotos/classes/gnusocialphotoalbum.php index 8b8c1dbf5a..acf509a22a 100644 --- a/plugins/GNUsocialPhotos/classes/gnusocialphotoalbum.php +++ b/plugins/GNUsocialPhotos/classes/gnusocialphotoalbum.php @@ -38,7 +38,7 @@ class GNUsocialPhotoAlbum extends Managed_DataObject public $__table = 'GNUsocialPhotoAlbum'; public $album_id; // int(11) -- Unique identifier for the album public $profile_id; // int(11) -- Profile ID for the owner of the album - public $album_name; // varchar(255) -- Title for this album + public $album_name; // varchar(191) -- Title for this album not 255 because utf8mb4 takes more space public $album_description; // text -- A description of the album public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -50,7 +50,7 @@ class GNUsocialPhotoAlbum extends Managed_DataObject 'fields' => array( 'album_id' => array('type' => 'serial', 'not null' => true, 'description' => 'Unique identifier for the album'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'Profile ID for the owner of the album'), - 'album_name' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'Title for this album'), + 'album_name' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'Title for this album'), 'album_description' => array('type' => 'text', 'not null' => true, 'description' => 'A description for this album'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php index 564ddce875..5a9b8de0cb 100644 --- a/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php +++ b/plugins/GNUsocialProfileExtensions/classes/GNUsocialProfileExtensionField.php @@ -37,9 +37,9 @@ class GNUsocialProfileExtensionField extends Managed_DataObject public $__table = 'gnusocialprofileextensionfield'; public $id; // int(11) public $systemname; // varchar(64) - public $title; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $description; // text - public $type; // varchar(255) + public $type; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -49,9 +49,9 @@ class GNUsocialProfileExtensionField extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'Unique ID for extension field'), 'systemname' => array('type' => 'varchar', 'not null' => true, 'length' => 64, 'description' => 'field systemname'), - 'title' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'field title'), + 'title' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field title'), 'description' => array('type' => 'text', 'not null' => true, 'description' => 'field description'), - 'type' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'field type'), + 'type' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'field type'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), diff --git a/plugins/GNUsocialVideo/classes/Video.php b/plugins/GNUsocialVideo/classes/Video.php index d2dd0469a1..09c1f6b844 100644 --- a/plugins/GNUsocialVideo/classes/Video.php +++ b/plugins/GNUsocialVideo/classes/Video.php @@ -39,8 +39,8 @@ class Video extends Managed_DataObject public $__table = 'video'; // table name public $id; // char (36) // UUID - public $uri; // varchar (255) // This is the corresponding notice's uri. - public $url; // varchar (255) + public $uri; // varchar (191) This is the corresponding notice's uri. not 255 because utf8mb4 takes more space + public $url; // varchar (191) not 255 because utf8mb4 takes more space public $profile_id; // int public static function getByNotice($notice) @@ -63,10 +63,10 @@ class Video extends Managed_DataObject 'not null' => true, 'description' => 'UUID'), 'uri' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'url' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'int', 'not null' => true), ), diff --git a/plugins/GroupPrivateMessage/classes/Group_message.php b/plugins/GroupPrivateMessage/classes/Group_message.php index 7e825d416d..e4e9f5f624 100644 --- a/plugins/GroupPrivateMessage/classes/Group_message.php +++ b/plugins/GroupPrivateMessage/classes/Group_message.php @@ -48,12 +48,12 @@ class Group_message extends Managed_DataObject { public $__table = 'group_message'; // table name public $id; // char(36) primary_key not_null - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $from_profile; // int public $to_group; // int public $content; public $rendered; - public $url; + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -62,8 +62,8 @@ class Group_message extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'char', 'not null' => true, 'length' => 36, 'description' => 'message uuid'), - 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'message uri'), - 'url' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'representation url'), + 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'message uri'), + 'url' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'representation url'), 'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'sending profile ID'), 'to_group' => array('type' => 'int', 'not null' => true, 'description' => 'receiving group ID'), 'content' => array('type' => 'text', 'not null' => true, 'description' => 'message content'), diff --git a/plugins/NoticeTitle/classes/Notice_title.php b/plugins/NoticeTitle/classes/Notice_title.php index 610e32fca7..f88ab70087 100644 --- a/plugins/NoticeTitle/classes/Notice_title.php +++ b/plugins/NoticeTitle/classes/Notice_title.php @@ -46,11 +46,11 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; */ class Notice_title extends Managed_DataObject { - const MAXCHARS = 255; + const MAXCHARS = 191; // not 255 because utf8mb4 takes more space public $__table = 'notice_title'; // table name public $notice_id; // int(11) primary_key not_null - public $title; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index adc1aa11be..d0ac83b56d 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -62,7 +62,7 @@ class FeedSub extends Managed_DataObject public $__table = 'feedsub'; public $id; - public $uri; + public $uri; // varchar(191) not 255 because utf8mb4 takes more space // PuSH subscription data public $huburi; @@ -80,7 +80,7 @@ class FeedSub extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'FeedSub local unique id'), - 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'FeedSub uri'), + 'uri' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'FeedSub uri'), 'huburi' => array('type' => 'text', 'description' => 'FeedSub hub-uri'), 'secret' => array('type' => 'text', 'description' => 'FeedSub stored secret'), 'sub_state' => array('type' => 'enum("subscribe","active","unsubscribe","inactive","nohub")', 'not null' => true, 'description' => 'subscription state'), diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 96c6986cdf..c9d65c56a7 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -31,8 +31,8 @@ class HubSub extends Managed_DataObject public $__table = 'hubsub'; public $hashkey; // sha1(topic . '|' . $callback); (topic, callback) key is too long for myisam in utf8 - public $topic; - public $callback; + public $topic; // varchar(191) not 255 because utf8mb4 takes more space + public $callback; // varchar(191) not 255 because utf8mb4 takes more space public $secret; public $lease; public $sub_start; @@ -55,8 +55,8 @@ class HubSub extends Managed_DataObject return array( 'fields' => array( 'hashkey' => array('type' => 'char', 'not null' => true, 'length' => 40, 'description' => 'HubSub hashkey'), - 'topic' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'HubSub topic'), - 'callback' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'HubSub callback'), + 'topic' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'HubSub topic'), + 'callback' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'HubSub callback'), 'secret' => array('type' => 'text', 'description' => 'HubSub stored secret'), 'lease' => array('type' => 'int', 'description' => 'HubSub leasetime'), 'sub_start' => array('type' => 'datetime', 'description' => 'subscription start'), diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 79098c6404..959aeef6bd 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -51,12 +51,12 @@ class Ostatus_profile extends Managed_DataObject { return array( 'fields' => array( - 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true), + 'uri' => array('type' => 'varchar', 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'integer'), 'group_id' => array('type' => 'integer'), 'peopletag_id' => array('type' => 'integer'), - 'feeduri' => array('type' => 'varchar', 'length' => 255), - 'salmonuri' => array('type' => 'varchar', 'length' => 255), + 'feeduri' => array('type' => 'varchar', 'length' => 191), + 'salmonuri' => array('type' => 'varchar', 'length' => 191), 'avatar' => array('type' => 'text'), 'created' => array('type' => 'datetime', 'not null' => true), 'modified' => array('type' => 'datetime', 'not null' => true), @@ -1806,8 +1806,8 @@ class Ostatus_profile extends Managed_DataObject } if (!empty($location)) { - if (mb_strlen($location) > 255) { - $location = mb_substr($note, 0, 255 - 3) . ' โ€ฆ '; + if (mb_strlen($location) > 191) { // not 255 because utf8mb4 takes more space + $location = mb_substr($note, 0, 191 - 3) . ' โ€ฆ '; } } diff --git a/plugins/OStatus/classes/Ostatus_source.php b/plugins/OStatus/classes/Ostatus_source.php index 6cecc323e0..88a6a58383 100644 --- a/plugins/OStatus/classes/Ostatus_source.php +++ b/plugins/OStatus/classes/Ostatus_source.php @@ -40,7 +40,7 @@ class Ostatus_source extends Managed_DataObject return array( 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'Notice ID relation'), - 'profile_uri' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'Profile URI'), + 'profile_uri' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'Profile URI'), 'method' => array('type' => 'enum("push","salmon")', 'not null' => true, 'description' => 'source method'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/plugins/Oembed/classes/File_oembed.php b/plugins/Oembed/classes/File_oembed.php index fda1636837..3fc655e170 100644 --- a/plugins/Oembed/classes/File_oembed.php +++ b/plugins/Oembed/classes/File_oembed.php @@ -31,14 +31,14 @@ class File_oembed extends Managed_DataObject public $type; // varchar(20) public $mimetype; // varchar(50) public $provider; // varchar(50) - public $provider_url; // varchar(255) + public $provider_url; // varchar(191) not 255 because utf8mb4 takes more space public $width; // int(4) public $height; // int(4) public $html; // text() - public $title; // varchar(255) + public $title; // varchar(191) not 255 because utf8mb4 takes more space public $author_name; // varchar(50) - public $author_url; // varchar(255) - public $url; // varchar(255) + public $author_url; // varchar(191) not 255 because utf8mb4 takes more space + public $url; // varchar(191) not 255 because utf8mb4 takes more space public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP public static function schemaDef() @@ -50,14 +50,14 @@ class File_oembed extends Managed_DataObject 'type' => array('type' => 'varchar', 'length' => 20, 'description' => 'oEmbed type: photo, video, link, rich'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'provider' => array('type' => 'varchar', 'length' => 50, 'description' => 'name of this oEmbed provider'), - 'provider_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of this oEmbed provider'), + 'provider_url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL of this oEmbed provider'), 'width' => array('type' => 'int', 'description' => 'width of oEmbed resource when available'), 'height' => array('type' => 'int', 'description' => 'height of oEmbed resource when available'), 'html' => array('type' => 'text', 'description' => 'html representation of this oEmbed resource when applicable'), - 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of oEmbed resource when available'), + 'title' => array('type' => 'varchar', 'length' => 191, 'description' => 'title of oEmbed resource when available'), 'author_name' => array('type' => 'varchar', 'length' => 50, 'description' => 'author name for this oEmbed resource'), - 'author_url' => array('type' => 'varchar', 'length' => 255, 'description' => 'author URL for this oEmbed resource'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL for this oEmbed resource when applicable (photo, link)'), + 'author_url' => array('type' => 'varchar', 'length' => 191, 'description' => 'author URL for this oEmbed resource'), + 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL for this oEmbed resource when applicable (photo, link)'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), 'primary key' => array('file_id'), diff --git a/plugins/OpenID/classes/User_openid.php b/plugins/OpenID/classes/User_openid.php index baff5cd7f9..7e53d8ec95 100644 --- a/plugins/OpenID/classes/User_openid.php +++ b/plugins/OpenID/classes/User_openid.php @@ -13,8 +13,8 @@ class User_openid extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'user_openid'; // table name - public $canonical; // varchar(255) primary_key not_null - public $display; // varchar(255) unique_key not_null + public $canonical; // varchar(191) primary_key not_null + public $display; // varchar(191) unique_key not_null public $user_id; // int(4) not_null public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -26,8 +26,8 @@ class User_openid extends Managed_DataObject { return array( 'fields' => array( - 'canonical' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'OpenID canonical string'), - 'display' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'OpenID display string'), + 'canonical' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'OpenID canonical string'), + 'display' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'OpenID display string'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'User ID for OpenID owner'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/plugins/OpenID/classes/User_openid_trustroot.php b/plugins/OpenID/classes/User_openid_trustroot.php index ec09e179e4..575854c332 100644 --- a/plugins/OpenID/classes/User_openid_trustroot.php +++ b/plugins/OpenID/classes/User_openid_trustroot.php @@ -13,7 +13,7 @@ class User_openid_trustroot extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'user_openid_trustroot'; // table name - public $trustroot; // varchar(255) primary_key not_null + public $trustroot; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $user_id; // int(4) primary_key not_null public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -25,7 +25,7 @@ class User_openid_trustroot extends Managed_DataObject { return array( 'fields' => array( - 'trustroot' => array('type' => 'varchar', 'not null' => true, 'length' => 255, 'description' => 'OpenID trustroot string'), + 'trustroot' => array('type' => 'varchar', 'not null' => true, 'length' => 191, 'description' => 'OpenID trustroot string'), 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'User ID for OpenID trustroot owner'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), diff --git a/plugins/Poll/classes/Poll.php b/plugins/Poll/classes/Poll.php index fe51c667d5..59161704a9 100644 --- a/plugins/Poll/classes/Poll.php +++ b/plugins/Poll/classes/Poll.php @@ -47,7 +47,7 @@ class Poll extends Managed_DataObject { public $__table = 'poll'; // table name public $id; // char(36) primary key not null -> UUID - public $uri; + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $profile_id; // int -> profile.id public $question; // text public $options; // text; newline(?)-delimited @@ -62,7 +62,7 @@ class Poll extends Managed_DataObject 'description' => 'Per-notice poll data for Poll plugin', 'fields' => array( 'id' => array('type' => 'char', 'length' => 36, 'not null' => true, 'description' => 'UUID'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true), + 'uri' => array('type' => 'varchar', 'length' => 191, 'not null' => true), 'profile_id' => array('type' => 'int'), 'question' => array('type' => 'text'), 'options' => array('type' => 'text'), diff --git a/plugins/Poll/classes/Poll_response.php b/plugins/Poll/classes/Poll_response.php index 20b7700147..78aec7ea05 100644 --- a/plugins/Poll/classes/Poll_response.php +++ b/plugins/Poll/classes/Poll_response.php @@ -46,7 +46,7 @@ class Poll_response extends Managed_DataObject { public $__table = 'poll_response'; // table name public $id; // char(36) primary key not null -> UUID - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $poll_id; // char(36) -> poll.id UUID public $profile_id; // int -> profile.id public $selection; // int -> choice # @@ -61,7 +61,7 @@ class Poll_response extends Managed_DataObject 'description' => 'Record of responses to polls', 'fields' => array( 'id' => array('type' => 'char', 'length' => 36, 'not null' => true, 'description' => 'UUID of the response'), - 'uri' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'UUID to the response notice'), + 'uri' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'UUID to the response notice'), 'poll_id' => array('type' => 'char', 'length' => 36, 'not null' => true, 'description' => 'UUID of poll being responded to'), 'profile_id' => array('type' => 'int'), 'selection' => array('type' => 'int'), diff --git a/plugins/QnA/classes/QnA_Answer.php b/plugins/QnA/classes/QnA_Answer.php index f4bf7a9d41..2aa69cf5a3 100644 --- a/plugins/QnA/classes/QnA_Answer.php +++ b/plugins/QnA/classes/QnA_Answer.php @@ -48,7 +48,7 @@ class QnA_Answer extends Managed_DataObject public $__table = 'qna_answer'; // table name public $id; // char(36) primary key not null -> UUID - public $uri; // varchar(255) + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $question_id; // char(36) -> question.id UUID public $profile_id; // int -> question.id public $best; // (boolean) int -> whether the question asker has marked this as the best answer @@ -71,7 +71,7 @@ class QnA_Answer extends Managed_DataObject ), 'uri' => array( 'type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true, 'description' => 'UUID to the answer notice', ), diff --git a/plugins/QnA/classes/QnA_Question.php b/plugins/QnA/classes/QnA_Question.php index b421b0aed1..b531838677 100644 --- a/plugins/QnA/classes/QnA_Question.php +++ b/plugins/QnA/classes/QnA_Question.php @@ -48,7 +48,7 @@ class QnA_Question extends Managed_DataObject public $__table = 'qna_question'; // table name public $id; // char(36) primary key not null -> UUID - public $uri; + public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $profile_id; // int -> profile.id public $title; // text public $description; // text @@ -71,7 +71,7 @@ class QnA_Question extends Managed_DataObject ), 'uri' => array( 'type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true ), 'profile_id' => array('type' => 'int'), diff --git a/plugins/Realtime/classes/Realtime_channel.php b/plugins/Realtime/classes/Realtime_channel.php index 5d6f0ff99a..7541593433 100644 --- a/plugins/Realtime/classes/Realtime_channel.php +++ b/plugins/Realtime/classes/Realtime_channel.php @@ -53,9 +53,9 @@ class Realtime_channel extends Managed_DataObject public $__table = 'realtime_channel'; // table name public $user_id; // int -> user.id, can be null - public $action; // string - public $arg1; // argument - public $arg2; // argument, usually null + public $action; // varchar(191) not 255 because utf8mb4 takes more space + public $arg1; // varchar(191) argument not 255 because utf8mb4 takes more space + public $arg2; // varchar(191) usually null not 255 because utf8mb4 takes more space public $channel_key; // 128-bit shared secret key public $audience; // listener count public $created; // created date @@ -73,15 +73,15 @@ class Realtime_channel extends Managed_DataObject 'not null' => false, 'description' => 'user viewing page; can be null'), 'action' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => true, 'description' => 'page being viewed'), 'arg1' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => false, 'description' => 'page argument, like username or tag'), 'arg2' => array('type' => 'varchar', - 'length' => 255, + 'length' => 191, 'not null' => false, 'description' => 'second page argument, like tag for showstream'), 'channel_key' => array('type' => 'varchar', diff --git a/plugins/TwitterBridge/classes/Twitter_synch_status.php b/plugins/TwitterBridge/classes/Twitter_synch_status.php index 9a20536147..28f60b9b3e 100644 --- a/plugins/TwitterBridge/classes/Twitter_synch_status.php +++ b/plugins/TwitterBridge/classes/Twitter_synch_status.php @@ -52,7 +52,7 @@ class Twitter_synch_status extends Managed_DataObject { public $__table = 'twitter_synch_status'; // table name public $foreign_id; // bigint primary_key not_null - public $timeline; // varchar(255) primary_key not_null + public $timeline; // varchar(191) primary_key not_null not 255 because utf8mb4 takes more space public $last_id; // bigint not_null public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -62,7 +62,7 @@ class Twitter_synch_status extends Managed_DataObject return array( 'fields' => array( 'foreign_id' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'Foreign message ID'), - 'timeline' => array('type' => 'varchar', 'length' => 255, 'description' => 'timeline name'), + 'timeline' => array('type' => 'varchar', 'length' => 191, 'description' => 'timeline name'), 'last_id' => array('type' => 'int', 'size' => 'big', 'not null' => true, 'description' => 'last id fetched'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), From 41baba9ed3f4f1afd7d9a66d50a23052c2cdc389 Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Thu, 12 Feb 2015 22:26:34 +0100 Subject: [PATCH 004/159] lock icon style fixed to match quitter style --- theme/neo-quitter/css/display.css | 9 +++++++++ theme/neo-quitter/images/lock.png | Bin 749 -> 429 bytes theme/neo-quitter/images/lock_open.png | Bin 727 -> 626 bytes 3 files changed, 9 insertions(+) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index d28251c967..eb9721c067 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -973,6 +973,15 @@ background:none; height: 60px; } +.checkbox-wrapper.unchecked label.checkbox { + background: url("../images/lock_open.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0); +} + + +.checkbox-wrapper.checked label.checkbox { + background: url("../images/lock.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0); +} + .form_notice label.notice_data-attach { background-image:none; display: block; diff --git a/theme/neo-quitter/images/lock.png b/theme/neo-quitter/images/lock.png index 2ebc4f6f9663e32cad77d67ef93ab8843dfea3c0..f0357ae21ebcfc4a1b89febdd7f4ade0bdf39f3d 100644 GIT binary patch delta 403 zcmV;E0c`&51+4>+B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra0t^)l9KG|JS^xk6I!Q!9R5;7+k_!_6c$6qNA(%3fhN)$d`PZbL7V5yDZhxd@-|FR@_j|tcen(f9vF*9?hdfd(+Wyw6Es-PB|0i%%^muEJTsiSOu`U3JzlmLG%S`ZkN6y(e0% zi=BD9aW~Ny)qlbpIv^>2Q!{{V(YLlC160VDbyGA0@bldQV9H?|$ZvPJHF>71TRq(fxw^a;2$t1z^*8$vh^I`7jo}uu`CZDZwvqc002ovPDHLkV1kUFuND9R delta 725 zcmV;`0xJEj1MLNnB!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o0007iNkl_6LXssanuR6PuPaD3lbFCV!?$c6MfcvuoP5I`Ae|tv9>?g+k#9o0pTxZ{R;$HSD&^Gv4`57d=52btg(E}fG&@~Gwqt*Ju>Izdy;7OR z&R*EjeD~5S{I-BCE!dVDLP)$=yXu&l7;fP9nN>_b`F~)z3<&bz{tXzk#PEkX-vX3D ze#82Z1_?;3jpwr+=7rO;@$&7V1bve(w02)15E_MHjIeMB2*;UL!2TX&>l@7OcPMKg z;mIs)v+n^QMJRofiRSuy>O6+{#cQa&US$7iOkAHu^XobR8i=M&kg$X;OfP_NWZ0w{ zpS}QJaDSBUD9FCVr`<3nU?QHLM6VNK?Y_fm0O0%so9=28soruwH<;wN~Xif>CvyTxz=Z6stxlichODIY+yNGt% zRM;m`>H4LOKLFs9Y%b5aUN|2|{0Zw|<_~i}mXz*V19AKYa(9KI!VHC&l?;W+Vt0tz2GirlQWKAz_ zD#*Y>qQIbiw5nauR`4Ha;lI#+-1R~bE;Er{m_?uz;^f%erhhaV(@9gj&vTyBV$z(T zFn`N)4j;}ro~p7lqoboZ=MWJ@gn=_XI{V=ZD;q*pT@!7I9xj~f^tR@`oj^LB#yLkk z9_Reoqu-{-pEbQ*a{QUTJ5s2$!0(&;oJLNb{o3`5%OC!H)oxBQKt(Qh|<-6m8pp_@9~32-b_&PuJm=V z57^94@#gD>ZUfd@eBUPs0>b45N&xjoI2Nl-4h;=qj3J-T<9DP+y7mKgp=8Y0AZDJuyF;+v=~at?_j1#c*8|Krx||fnf4BjepT)GMNlv7*;$i_vAWr4+puC zdWA8DOeRy&_a?@lt5lQ}Tlz?_WTB>o#NlR|I*-%aob#Oh0nYF_yRNSb9*Mq7RA+NJ z{u)yxKUXBbSVinwZ+AoXR?gXV;>o+-$(MIXwP%0-;Ga>!!R3{idDMoe3Tn!y?hg2s z16^$(0#fSs2CU2ms910gHD(VRBwA1#g44YL-`^L&SrmubGEn_LK-=I5>I76#Yj+R$ nt*tEGYrS6-i;93q83KL+W!DMjw4o|C00000NkvXXu0mjfNpcpo delta 703 zcmV;w0zm!p1lI+SB!2{FK}|sb0I$e51&Zka000?uMObuGZ)S9NVRB^vL1b@YWgtmy zVP|DhWnpA_ami&o0007MNklEmQZ?2Gx^S&R7lI2n zqAMv1ih>nkv>T!Q52UW#i0eQ=1jU657vjp5s1!85YO{#6jei(ul0K$0_iYL;mu6>YDHIC%v9Yl`y$ZZkoioO;u&}Tc z1VQyrb82d;0<=1vjv5>s%x`D`$XII;5!-udVq#*D4MK?sjaOIX+00RlQ&?*`bL0&f z(TFvONm6V3)OFiWf%6JE?TO*wwRb8}Aj0_NV<bbqHUR=w^RasIEN~WJ z;9xruB%v+zyn=gX@QZ0*HgP4kIT2k^2xKsjt=dEXjfn3%%8 zy{xb15P!1<;{F0W0MQx|3s$rAVTN|?HFyTM?ufz&B&Pl46YZ~!#IAFQ)+q&ACsZ3# z*uRI&<|248^(ogj2 zGXC&Z1ee%O14JyjT~`^{ok3-D$rpP4;4H);emJ;{)e+)sGB0CNfH Date: Thu, 12 Feb 2015 22:55:01 +0100 Subject: [PATCH 005/159] updated neo-quitter favicon to match the theme style --- theme/neo-quitter/favicon.ico | Bin 5430 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/neo-quitter/favicon.ico b/theme/neo-quitter/favicon.ico index be88e6647368a55b9e322f41260ead9b5522e995..af7a8481315353bfd882da21ed8664d593fa6ba4 100755 GIT binary patch literal 1150 zcmcJOO)ErE7{{N<`wY!xWJ8mhXvoHfg}v`!ZDXU9Z{U(OWrvlG^(^e9>?mw(*jy<} z(G(>N*YBA*N2lhT*}2p2{-5)IUe0})E0W#XsIULw zREeb@7GM=NVI5Xr8Zxc6BwvJcNCRBsmwYquBX~4@ALs_m!3^wzommO=k5Kbt>P}Ie zmxnSegUwy|`qiUm9KONs<!U!ngXr!&sL z&Tv)d9f5x0Ee~qCVE}TV*Q~1dQh>kjFil0Od69%Ca$-o@SaXHR7Yv&i?=A+-K^1E7 E3lszz^Z)<= literal 5430 zcmchbPiS0K6vl6?5K(CcX-m~=AA)}hibGulRNA+xq81EvpxW?-mdq`vIN@I0g!a0p^vU%x6o762+iw`|J zgpX8+gt{;(B*JD}GInLwS8f^b{;faS7=8Xj{5EncE*-x~X3EIg-g3--U*)v|IpC6mQ zl9)|`oi%jI_^Bg)7iUie-{|lRWZN=(YNS5S3Z;p4w!Z^N0-#>z0Ds*eU@$-C} zW8$Nu9Xy#4W2No(feLemTB%aW;6Jih8FlXZj@956q%)O6s(z|D*Cz}J^d+Yjotu^| z=S(ET0_Ra^96Y@@YD*rR7m;wITUCS>12VbM0f;XaTAZQTx~6)jMFMME7pM=Qp9qn# zoh^a;;@3@o|07k_V~%r{GnI3N^9RsR9(^&KbV&FaS-0>uE*!fsI%XlUh z-WMWo2xYr4(s;gh=(h3k(eoqnlM1nbeVv@C1Ha9)7e|9G?+^IOz&V$_S6Z@XFGT`t zMnigha`vv5%TFi2$3Ey#bJl=&*(YCI4*t8@GERKey$^?2k%jkMBEQsN2LH^Ly(fr| zb+sHhv)_L2Q{VdRT6@gq@)A8j40h%-FRro{X)qO9i zKhy^AJ~&r=-@?!ShO-zOW6bCC>&9#2CFBuz291Y$6@8IA91|~$g*|QWd;Bqn9rNaY zBU!?q;)A^LJ%4(p!xzt1ld`(AzWJDX;OF;63=Qr*#8TvezZh3H9^$dRM_r2X$$z(| z>(X6y&JAn;_S6_y4Z88#II&X?1Af>y{Jyf^Vv*nS4{I6i*%R&w`TLs;!W?lJPcM>u z3goGt!}-F!@50$b9d{P)MBID0>o89oy~aRYuotY2s1wHUUA!;l?`#%FcE{S%ey2`w zXYT_ztu@qXZHC)op%xYcdu%g%(tfw%GVWCUBtvPmj~`?hzck{TC&rC0yw`>vdpt;yQs*R)>yPmeL)m@X z=C>*>ripi72{CbR=KFvgp%p^?%`bH%2Ydc65z%+=)+|rzUwgUQQ~vOopS)y$@O_hgcM?a)IUk4V6EEv;d&|4xq z(IFS+S$Cv30qfDx%qIJ;^5lZ;x8o=MUkm5_wW}Yj$&IrKpXd>b9EKdp6@S?nT&ZB| z&%PfLIvTp!Z+J!%4f{Qxcry+6x*z}iJDi2&X|d*I_WcNFiZ5!-Smr0~AlvwXcMoxd zJ1zIhFPoRcZ-$)h_hbCLAJ7#NfxVoJoqviv=PVEP*W`@uIxW^*_`cw7%^jOs!-)i} zRj$TK7hiS!2<*G9v_#7OyZJ?b@X0vjZhHvM?EGj+XGDmE^;)b+bhpw{az6L@gw>XM zS{^m^`IN|$Wo1gaH|1K Date: Thu, 12 Feb 2015 23:07:49 +0100 Subject: [PATCH 006/159] moved profile/group patch from core to profile_list --- theme/neo-quitter/css/display.css | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index eb9721c067..773f397f71 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -161,12 +161,6 @@ address a { } -#core .h-card .u-photo { - float: left; - margin-right: 8px; - margin-left: 4px; -} - #aside_primary_wrapper { background-color: transparent; } @@ -598,6 +592,7 @@ ul.profile_list li { } .profile_list .h-card .u-photo { + margin-left: 10px; margin-right: 10px; } From d0347bb98fe97368b34cc82b69ce3a3284193362 Mon Sep 17 00:00:00 2001 From: buttle Date: Fri, 13 Feb 2015 16:26:41 +0100 Subject: [PATCH 007/159] Removing home stub if empty Added an Event HomeStubNavItems menu->subMenu() returns false if empty --- EVENTS.txt | 9 +++++++++ lib/homestubnav.php | 23 ++++++++++++----------- lib/menu.php | 5 +++-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index 197b8afe6f..66a86652e9 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1463,3 +1463,12 @@ StartNotifyMentioned: During notice distribution, we send notifications (email, EndNotifyMentioned: During notice distribution, we send notifications (email, im...) to the profiles who were somehow mentioned. - $stored: Notice object that is being distributed. - $mentioned_ids: Array of profile IDs (not just for local users) who got mentioned by the notice. + +StartHomeStubNavItems: Go back Home nav items. Default includes just one item 'home' +- $action: action being executed (for output and params) +- $items: array of items in the nav + +EndHomeStubNavItems: +- $action: action being executed (for output and params) +- $items: array of items in the nav + diff --git a/lib/homestubnav.php b/lib/homestubnav.php index d22d1fd16c..64212f18aa 100644 --- a/lib/homestubnav.php +++ b/lib/homestubnav.php @@ -49,17 +49,18 @@ class HomeStubNav extends Menu { function getItems() { - if (Event::handle('StartHomeStubNav', array(&$this->action))) { - return array(array('top', - array(), - // TRANS: Menu item in personal group navigation menu. - _m('MENU','Home'), - // TRANS: Menu item title in personal group navigation menu. - // TRANS: %s is a username. - _('Back to top'), - 'nav_return_top')); - Event::handle('EndHomeStubNav', array(&$this->action)); + $items = array(); + if (Event::handle('StartHomeStubNavItems', array($this->action, &$items))) { + $items[] = array('top', + array(), + // TRANS: Menu item in personal group navigation menu. + _m('MENU','Home'), + // TRANS: Menu item title in personal group navigation menu. + // TRANS: %s is a username. + _('Back to top'), + 'nav_return_top'); + Event::handle('EndHomeStubNavItems', array($this->action, &$items)); } - return Null; + return $items; } } diff --git a/lib/menu.php b/lib/menu.php index 3d22ff4924..4baeb70d2f 100644 --- a/lib/menu.php +++ b/lib/menu.php @@ -150,8 +150,9 @@ class Menu extends Widget function submenu($label, $menu) { - if(!$menu->getItems()) - return; + if (empty($menu->getItems())){ + return false; + } $this->action->elementStart('li'); $this->action->element('h3', null, $label); $menu->show(); From 9a8ccbaef268474708009dde1635000b69e2df48 Mon Sep 17 00:00:00 2001 From: buttle Date: Fri, 13 Feb 2015 16:38:22 +0100 Subject: [PATCH 008/159] Call HomeStubNav instead of duplicating code adminpanelnav.php adds a homeStub but does not use the code created for the job. --- lib/adminpanelnav.php | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/lib/adminpanelnav.php b/lib/adminpanelnav.php index 93a4d36ebb..9044749181 100644 --- a/lib/adminpanelnav.php +++ b/lib/adminpanelnav.php @@ -59,24 +59,8 @@ class AdminPanelNav extends Menu $nickname = $user->nickname; $name = $user->getProfile()->getBestName(); - // Stub section w/ home link - $this->action->elementStart('ul'); - $this->action->elementStart('li'); - // TRANS: Header in administrator navigation panel. - $this->action->element('h3', null, _m('HEADER','Home')); - $this->action->elementStart('ul', 'nav'); - $this->out->menuItem(common_local_url('all', array('nickname' => - $nickname)), - // TRANS: Menu item in administrator navigation panel. - _m('MENU','Home'), - // TRANS: Menu item title in administrator navigation panel. - // TRANS: %s is a username. - sprintf(_('%s and friends'), $name), - $this->action == 'all', 'nav_timeline_personal'); - - $this->action->elementEnd('ul'); - $this->action->elementEnd('li'); - $this->action->elementEnd('ul'); + $stub = new HomeStubNav($this->action); + $this->submenu(_m('MENU','Home'), $stub); $this->action->elementStart('ul'); $this->action->elementStart('li'); From 107ca924587708923972e07666938c98b08ae36c Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Fri, 13 Feb 2015 18:00:57 +0100 Subject: [PATCH 009/159] use Genericons and fontawesome instead of images --- theme/neo-quitter/css/display.css | 23 ++++++++++++++++++++--- theme/neo-quitter/images/lock.png | Bin 429 -> 0 bytes theme/neo-quitter/images/lock_open.png | Bin 626 -> 0 bytes 3 files changed, 20 insertions(+), 3 deletions(-) delete mode 100644 theme/neo-quitter/images/lock.png delete mode 100644 theme/neo-quitter/images/lock_open.png diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index 773f397f71..8c3845be7a 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -968,13 +968,30 @@ background:none; height: 60px; } +.checkbox-wrapper.checked label.checkbox, .checkbox-wrapper.unchecked label.checkbox { - background: url("../images/lock_open.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0); + background-image:none; } +.checkbox-wrapper.checked label.checkbox:before, +.checkbox-wrapper.unchecked label.checkbox:before { + content: "\f023"; + display: block; + font: 20px/1 "fa"; + height: 35px; + left: 0px; + position: absolute; + top: 0px; + width: 35px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color:rgba(0,0,0,0.6); + text-indent:0; + text-align:left; +} -.checkbox-wrapper.checked label.checkbox { - background: url("../images/lock.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0); +.checkbox-wrapper.unchecked label.checkbox:before { + content: "\f09c"; } .form_notice label.notice_data-attach { diff --git a/theme/neo-quitter/images/lock.png b/theme/neo-quitter/images/lock.png deleted file mode 100644 index f0357ae21ebcfc4a1b89febdd7f4ade0bdf39f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429 zcmV;e0aE^nP)>}lnpyw=0Xj)U zK~y-)?UBt&0#O)-pD8PUCd17nH5FNbq_l}3h+2eo7u`p<&@Hs-7NSKv#ju?i1|gU- zl7^{ek@?r8o)+rBpl+mP-|FR@_j|tcen(f9vF*9?hdfd(+Wyw6Es-PB|0 zi%%^muEJTsiSOu`U3JzlmLG%S`ZkN6y(e0%i=BD9aW~Ny)xsM(ASr%RGk|T;x3(bz zRLGZgQ#1qc^W6eq%3&MGZ+Eygd8VsdJ>LLe+%k5MEOnoz7ZZfSH^Tg9ZM57|H){5Q znD!yIJub-vc&_zC{e_G+dSa`bAs)4nuQojkvQ--|f@sr$z@O~kA224st|+Lo^&H?A Xa_?!eEDs=W00000NkvXXu0mjf-=eUz diff --git a/theme/neo-quitter/images/lock_open.png b/theme/neo-quitter/images/lock_open.png deleted file mode 100644 index 1783dd55c4b8f4a98e60d88dfa564c8e47166792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)rqloc0sl!v zK~y-)ozTroRACgy@$VhAv8yJgi8E@0PGn6lZYs#YLZZN+eYC1w&{pstXyL!me%$p! z5H2&3UYJFo6yoIA+@>@d(@9gj&vTyBV$z(TFn`N)4j;}ro~p7lqoboZ=MWJ@gn=_X zI{V=ZD;q*pT@!7I9xj~f^tR@`oj^LB#yLkk9_Reoqu-{-pEbQ*a{QUTJ5 zs2$!0(&;oJLNb{o3`5%OC!H)7Q>MF8n%Ef3sF+ZBy>aVS>@pSCPa9tEY zF`<-!VDdJN(Pc833}F~nJS_L*I&%*PxsiH>F@{VgQ_=S(#-FQHloVU~NU&s~riH}e zW|}&W)7zZ$oc#gL@HxA#uL~ZDzDrbRb2{@SkL-tnA*>&Q{yWYu{ zcSyBofB)d0QNh9Gm6>_ehNuc^%BSuQ_>}`)Z6E^b_6DrX2B=tY4mD;E8zfp#8-mll z0pH&jz*!WB+A>i6KS0~y2QEPV(_^quh-D|yH6pM<0NErft0%g|;=Cq+IHUIzs M07*qoM6N<$g6;wrUH||9 From fe14c64e5e266e0189232d4a3921cb940f1d133e Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Fri, 13 Feb 2015 18:09:43 +0100 Subject: [PATCH 010/159] just make sure that input box and input box label are the same color --- theme/neo-quitter/css/display.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index 8c3845be7a..04fb2ef5d3 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -443,7 +443,7 @@ body#doc #content_inner p.faq-credits { .input_form fieldset fieldset label { left: 10px; - background: #f7f7f7; + background: #fff; } .input_forms > label { @@ -953,6 +953,7 @@ background:none; .threaded-replies .placeholder { border-radius: 0; box-shadow: none; + background: none repeat scroll 0 0 #fff; } .form_notice textarea { From 1fcb7afd3a8ae76de2142f50efe40b9a5e30156a Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Fri, 13 Feb 2015 23:09:34 +0100 Subject: [PATCH 011/159] fixed alignment of textarea fixed event view --- theme/neo-quitter/css/display.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index 04fb2ef5d3..cd04fcee61 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -441,6 +441,10 @@ body#doc #content_inner p.faq-credits { margin: 0 0 5px 5px; } +.input_form .form_settings li textarea { + margin: 0 0 5px 5px; +} + .input_form fieldset fieldset label { left: 10px; background: #fff; @@ -501,6 +505,10 @@ body#doc #content_inner p.faq-credits { text-decoration: none; } +#input_form_event .form_settings .form_data li { + width: 100% !important; +} + .form_notice .error, .form_notice .success, .form_notice .notice-status { background-color: #33bcef; border: 0 none; From b6b9036821e4874e6a65c7508d3b168ce0aa4873 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 14 Feb 2015 17:32:35 +0100 Subject: [PATCH 012/159] StartSubMenu and EndSubMenu events --- EVENTS.txt | 9 +++++++++ lib/menu.php | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index b98c6ff52f..9a6ddfd9a4 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1472,3 +1472,12 @@ EndHomeStubNavItems: - $action: action being executed (for output and params) - $items: array of items in the nav +EndSubMenu: After outputting a submenu (including enclosing tags) to HTML +- $out: HTMLOutputter used to output (usually an Action, but not always!) +- $menu: The Menu object outputted as a submenu. +- $label: Localized text which represents the menu item. + +StartSubMenu: Before outputting a submenu (including enclosing tags) to HTML +- $out: HTMLOutputter used to output (usually an Action, but not always!) +- $menu: The Menu object outputted as a submenu. +- $label: Localized text which represents the menu item. diff --git a/lib/menu.php b/lib/menu.php index 4baeb70d2f..236e99263d 100644 --- a/lib/menu.php +++ b/lib/menu.php @@ -150,12 +150,12 @@ class Menu extends Widget function submenu($label, $menu) { - if (empty($menu->getItems())){ - return false; + if (Event::handle('StartSubMenu', array($this->action, $menu, $label))) { + $this->action->elementStart('li'); + $this->action->element('h3', null, $label); + $menu->show(); + $this->action->elementEnd('li'); + Event::handle('EndSubMenu', array($this->action, $menu, $label)); } - $this->action->elementStart('li'); - $this->action->element('h3', null, $label); - $menu->show(); - $this->action->elementEnd('li'); } } From 9c83ddc12215e86fc18a144ffc79e26335653ea3 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 14 Feb 2015 17:35:34 +0100 Subject: [PATCH 013/159] Fixed some recently added EVENTS documentation --- EVENTS.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index 9a6ddfd9a4..5e6360d1e7 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1465,12 +1465,12 @@ EndNotifyMentioned: During notice distribution, we send notifications (email, im - $mentioned_ids: Array of profile IDs (not just for local users) who got mentioned by the notice. StartHomeStubNavItems: Go back Home nav items. Default includes just one item 'home' -- $action: action being executed (for output and params) -- $items: array of items in the nav +- $out: HTMLOutputter used to output (usually an Action, but not always!) +- &$items: Referenced array of items in the nav (add if desired) EndHomeStubNavItems: -- $action: action being executed (for output and params) -- $items: array of items in the nav +- $out: HTMLOutputter used to output (usually an Action, but not always!) +- $items: array of menu items EndSubMenu: After outputting a submenu (including enclosing tags) to HTML - $out: HTMLOutputter used to output (usually an Action, but not always!) From c60b6bdb38e9d9fb4dcac5f520c3f41aa4027b2f Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 14 Feb 2015 17:37:35 +0100 Subject: [PATCH 014/159] Wrong order of start/end events. My hobby OCD was disturbed. --- EVENTS.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index 5e6360d1e7..4f4121ac38 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1472,12 +1472,12 @@ EndHomeStubNavItems: - $out: HTMLOutputter used to output (usually an Action, but not always!) - $items: array of menu items -EndSubMenu: After outputting a submenu (including enclosing tags) to HTML -- $out: HTMLOutputter used to output (usually an Action, but not always!) -- $menu: The Menu object outputted as a submenu. -- $label: Localized text which represents the menu item. - StartSubMenu: Before outputting a submenu (including enclosing tags) to HTML - $out: HTMLOutputter used to output (usually an Action, but not always!) - $menu: The Menu object outputted as a submenu. - $label: Localized text which represents the menu item. + +EndSubMenu: After outputting a submenu (including enclosing tags) to HTML +- $out: HTMLOutputter used to output (usually an Action, but not always!) +- $menu: The Menu object outputted as a submenu. +- $label: Localized text which represents the menu item. From 396f1e92ca11c6c5c92a3e65d9fe65da1151783d Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sun, 15 Feb 2015 13:17:04 +0100 Subject: [PATCH 015/159] Present http:// alias by default in WebFinger output because it might help us (and especially StatusNet sites) to recognize profiles that have migrated from HTTP to HTTPS! --- plugins/WebFinger/WebFingerPlugin.php | 7 +++++++ plugins/WebFinger/lib/webfingerresource.php | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/plugins/WebFinger/WebFingerPlugin.php b/plugins/WebFinger/WebFingerPlugin.php index f7e428e54c..e1e6a1b41c 100644 --- a/plugins/WebFinger/WebFingerPlugin.php +++ b/plugins/WebFinger/WebFingerPlugin.php @@ -31,6 +31,13 @@ if (!defined('GNUSOCIAL')) { exit(1); } class WebFingerPlugin extends Plugin { + public $http_alias = true; + + public function initialize() + { + common_config_set('webfinger', 'http_alias', $this->http_alias); + } + public function onRouterInitialized($m) { $m->connect('.well-known/host-meta', array('action' => 'hostmeta')); diff --git a/plugins/WebFinger/lib/webfingerresource.php b/plugins/WebFinger/lib/webfingerresource.php index d473d95628..61b2cc09ad 100644 --- a/plugins/WebFinger/lib/webfingerresource.php +++ b/plugins/WebFinger/lib/webfingerresource.php @@ -34,7 +34,12 @@ abstract class WebFingerResource $aliases = array(); // Add the URI as an identity, this is _not_ necessarily an HTTP url - $aliases[] = $this->object->getUri(); + $uri = $this->object->getUri(); + $aliases[] = $uri; + if (common_config('webfinger', 'http_alias') + && strtolower(parse_url($uri, PHP_URL_SCHEME)) === 'https') { + $aliases[] = preg_replace('/^https:/', 'http:', $uri, 1); + } try { $aliases[] = $this->object->getUrl(); From 2b93643277d4198f6b4eedc918790549a914adac Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sun, 15 Feb 2015 13:33:36 +0100 Subject: [PATCH 016/159] Don't default to publishing http: alias! It seems to have caused a problem with at least an older codebase of remote GNU social sites, but either way we shouldn't present the user as aliased on an insecure connection if there is no real reason to. --- plugins/WebFinger/WebFingerPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/WebFinger/WebFingerPlugin.php b/plugins/WebFinger/WebFingerPlugin.php index e1e6a1b41c..e5759e886c 100644 --- a/plugins/WebFinger/WebFingerPlugin.php +++ b/plugins/WebFinger/WebFingerPlugin.php @@ -31,7 +31,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } class WebFingerPlugin extends Plugin { - public $http_alias = true; + public $http_alias = false; public function initialize() { From fb03fc073a38296602a52cc9c9899099d818f915 Mon Sep 17 00:00:00 2001 From: Chimo Date: Sun, 15 Feb 2015 16:00:23 -0500 Subject: [PATCH 017/159] ApiTimelineList: Fixes ServerErrorAction "No matches for action 'ApiTimelineList' with arguments 'format=atom id=1'" for 'api/:user/lists/:id/statuses.:format' URLs --- lib/apiaction.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/apiaction.php b/lib/apiaction.php index d85029f433..5cebce33da 100755 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -1516,6 +1516,11 @@ class ApiAction extends Action $aargs['id'] = $id; } + $user = $this->arg('user'); + if (!empty($user)) { + $aargs['user'] = $user; + } + $tag = $this->arg('tag'); if (!empty($tag)) { $aargs['tag'] = $tag; From 3f8a519980ac6db69465ad64e9c36000619f18cf Mon Sep 17 00:00:00 2001 From: Chimo Date: Sun, 15 Feb 2015 16:11:23 -0500 Subject: [PATCH 018/159] JS: Fixes jQueryUI autocomplete 'undefined' errors data("autocomplete") was renamed to data("ui-autocomplete") starting from v1.9: http://jqueryui.com/upgrade-guide/1.9/#changed-naming-convention-for-data-keys --- js/util.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/util.js b/js/util.js index 9c727e9a53..6a1eb82b2e 100644 --- a/js/util.js +++ b/js/util.js @@ -1580,7 +1580,7 @@ var SN = { // StatusNet // don't navigate away from the field on tab when selecting an item txtBox.on( "keydown", function ( event ) { if ( event.keyCode === $.ui.keyCode.TAB && - $(this).data( "autocomplete" ).menu.active ) { + $(this).data( "ui-autocomplete" ).menu.active ) { event.preventDefault(); } }).autocomplete({ @@ -1601,7 +1601,7 @@ var SN = { // StatusNet this.value = terms.join(" "); return false; } - }).data('autocomplete')._renderItem = function (ul, item) { + }).data('ui-autocomplete')._renderItem = function (ul, item) { // FIXME: with jQuery UI you cannot have it highlight the match var _l = '' + item.tag + ' ' + item.mode + '' From 4c457c82ef5a4e57dbf0f934d5978d5f05f1566c Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Sun, 15 Feb 2015 14:17:00 +0100 Subject: [PATCH 019/159] removed text beside lock icon and fixed alignment --- theme/neo-quitter/css/display.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index cd04fcee61..9e16323057 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -980,6 +980,9 @@ background:none; .checkbox-wrapper.checked label.checkbox, .checkbox-wrapper.unchecked label.checkbox { background-image:none; + opacity: 0.6; + padding-left: 30px; + color:transparent; } .checkbox-wrapper.checked label.checkbox:before, From ef780d50343a228a1cd5a1e14dd3d05707d06ea1 Mon Sep 17 00:00:00 2001 From: Chimo Date: Sun, 15 Feb 2015 19:10:05 -0500 Subject: [PATCH 020/159] Move people tag autocomplete JS to plugin As discussed in https://gitorious.org/social/mainline/merge_requests/47 --- js/util.js | 55 ----------------- plugins/Autocomplete/js/autocomplete.go.js | 69 +++++++++++++++++++++- 2 files changed, 68 insertions(+), 56 deletions(-) diff --git a/js/util.js b/js/util.js index 6a1eb82b2e..2611d8515a 100644 --- a/js/util.js +++ b/js/util.js @@ -1562,60 +1562,6 @@ var SN = { // StatusNet }); }, - /** - * Called when a people tag edit box is shown in the interface - * - * - loads the jQuery UI autocomplete plugin - * - sets event handlers for tag completion - * - */ - PeopletagAutocomplete: function (txtBox) { - var split = function (val) { - return val.split( /\s+/ ); - } - var extractLast = function (term) { - return split(term).pop(); - } - - // don't navigate away from the field on tab when selecting an item - txtBox.on( "keydown", function ( event ) { - if ( event.keyCode === $.ui.keyCode.TAB && - $(this).data( "ui-autocomplete" ).menu.active ) { - event.preventDefault(); - } - }).autocomplete({ - minLength: 0, - source: function (request, response) { - // delegate back to autocomplete, but extract the last term - response($.ui.autocomplete.filter( - SN.C.PtagACData, extractLast(request.term))); - }, - focus: function () { - return false; - }, - select: function (event, ui) { - var terms = split(this.value); - terms.pop(); - terms.push(ui.item.value); - terms.push(""); - this.value = terms.join(" "); - return false; - } - }).data('ui-autocomplete')._renderItem = function (ul, item) { - // FIXME: with jQuery UI you cannot have it highlight the match - var _l = '' + item.tag - + ' ' + item.mode + '' - + '' + item.freq + '' - - return $("
  • ") - .addClass('mode-' + item.mode) - .addClass('ptag-ac-line') - .data("item.autocomplete", item) - .append(_l) - .appendTo(ul); - } - }, - /** * Run setup for the ajax people tags editor * @@ -1644,7 +1590,6 @@ var SN = { // StatusNet } SN.C.PtagACData = data; - SN.Init.PeopletagAutocomplete(form.find('#tags')); } }); diff --git a/plugins/Autocomplete/js/autocomplete.go.js b/plugins/Autocomplete/js/autocomplete.go.js index 4e7058dd9d..829581ae3e 100644 --- a/plugins/Autocomplete/js/autocomplete.go.js +++ b/plugins/Autocomplete/js/autocomplete.go.js @@ -13,7 +13,7 @@ SN.Init.NoticeFormSetup = function(form) { // Only attach to traditional-style forms var textarea = form.find('.notice_data-text:first'); - if (textarea.length == 0) { + if (textarea.length === 0) { return; } @@ -69,3 +69,70 @@ SN.Init.NoticeFormSetup = function(form) { .appendTo(ul); }; }; + +/** + * Called when a people tag edit box is shown in the interface + * + * - loads the jQuery UI autocomplete plugin + * - sets event handlers for tag completion + * + */ +SN.Init.PeopletagAutocomplete = function(txtBox) { + var split, + extractLast; + + split = function(val) { + return val.split( /\s+/ ); + }; + + extractLast = function(term) { + return split(term).pop(); + }; + + // don't navigate away from the field on tab when selecting an item + txtBox + .on('keydown', function(event) { + if (event.keyCode === $.ui.keyCode.TAB && + $(this).data('ui-autocomplete').menu.active) { + event.preventDefault(); + } + }) + .autocomplete({ + minLength: 0, + source: function(request, response) { + // delegate back to autocomplete, but extract the last term + response($.ui.autocomplete.filter( + SN.C.PtagACData, extractLast(request.term))); + }, + focus: function () { + return false; + }, + select: function(event, ui) { + var terms = split(this.value); + terms.pop(); + terms.push(ui.item.value); + terms.push(''); + this.value = terms.join(' '); + return false; + } + }) + .data('ui-autocomplete') + ._renderItem = function (ul, item) { + // FIXME: with jQuery UI you cannot have it highlight the match + var _l = '' + item.tag + + ' ' + item.mode + '' + + '' + item.freq + ''; + + return $('
  • ') + .addClass('mode-' + item.mode) + .addClass('ptag-ac-line') + .data('item.autocomplete', item) + .append(_l) + .appendTo(ul); + }; +}; + +$(document).on('click', '.peopletags_edit_button', function () { + SN.Init.PeopletagAutocomplete($(this).closest('dd').find('[name="tags"]')); +}); + From 0168fddae545fda6ed4356b0d9bfa6d5025f4799 Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Mon, 16 Feb 2015 17:37:13 +0100 Subject: [PATCH 021/159] updated font settings to match qvitter --- theme/neo-quitter/css/display.css | 39 ++++++++----------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index 9e16323057..a027708345 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -38,27 +38,6 @@ font-style: normal; } -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Regular.eot?') format('eot'), url('../fonts/Lato-Regular.woff') format('woff'), url('../fonts/Lato-Regular.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Bold.eot?') format('eot'), url('../fonts/Lato-Bold.woff') format('woff'), url('../fonts/Lato-Bold.ttf') format('truetype'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Italic.eot?') format('eot'), url('../fonts/Lato-Italic.woff') format('woff'), url('../fonts/Lato-Italic.ttf') format('truetype'); - font-weight: normal; - font-style: italic; -} - @media screen, projection, tv { /* general styles and layout */ @@ -70,11 +49,11 @@ html, body { body { background-color: #E9EAED; color: #222; - font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } input, textarea, select, option { - font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } a {color: #006c9b;} @@ -112,7 +91,7 @@ address { background-image: url("../icons-hires.png?v=2"); background-size: 150px 2786px; background-repeat:no-repeat; - } +} address { background-position: -10px -600px; @@ -126,19 +105,21 @@ address { width: 89px; z-index: 1001; background-color:#0084B4; - } +} + address:hover { background-position: -10px -635px; - } +} + address a { height: 34px; width: 89px; display:block; - } +} .logo { display: none; - } +} #header { background-color: #fff; @@ -590,7 +571,7 @@ ul.profile_list li { content:"@"; } -#groupdirectory .profile_list .h-card .p-nickname:before { +#groupdirectory .profile_list .h-card .p-nickname:before { content:"!"; } From f7b41625e50519f921bf022589736b69ca564e43 Mon Sep 17 00:00:00 2001 From: Marcus Moeller Date: Mon, 16 Feb 2015 17:50:43 +0100 Subject: [PATCH 022/159] opacity is not needed as it's transparent use alignment instead of padding for padlock symbol --- theme/neo-quitter/css/display.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/theme/neo-quitter/css/display.css b/theme/neo-quitter/css/display.css index a027708345..bdaea98e52 100644 --- a/theme/neo-quitter/css/display.css +++ b/theme/neo-quitter/css/display.css @@ -961,8 +961,6 @@ background:none; .checkbox-wrapper.checked label.checkbox, .checkbox-wrapper.unchecked label.checkbox { background-image:none; - opacity: 0.6; - padding-left: 30px; color:transparent; } @@ -970,9 +968,9 @@ background:none; .checkbox-wrapper.unchecked label.checkbox:before { content: "\f023"; display: block; - font: 20px/1 "fa"; + font: 22px/1 "fa"; height: 35px; - left: 0px; + left: 10px; position: absolute; top: 0px; width: 35px; From 406b6148f53faea413050b4c068d688399e9430c Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 01:26:18 +0100 Subject: [PATCH 023/159] CSS: notice images no wider than 100% We should actually not allow remote images to be given in the src attribute because they can be used for tracking and other nasty stuff without being seen by the enduser. Also, allowing remote images linked like this won't work for users who run plugins like RequestPolicy etc. anyway. A better method would be to make them listed as attachments instead. Then we can use that subsystem for making thumbnails to store locally, hotlinking sources and whatnot. --- theme/base/css/display.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index cfc644d96b..7d28cee8df 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -713,6 +713,10 @@ font-style:italic; overflow-y: auto; } +.notice .e-content img { + max-width: 100%; +} + .notice-options { margin-bottom: 7px; margin-top: 12px; From 75f35bcfe745a3651d8cdbf46ebb64c5f3340f3e Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 16:39:27 +0100 Subject: [PATCH 024/159] apiauth action with ->user changed to ->scoped --- actions/apifriendshipsdestroy.php | 47 +++++++++---------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/actions/apifriendshipsdestroy.php b/actions/apifriendshipsdestroy.php index 5f7c85e0af..5c8036bc45 100644 --- a/actions/apifriendshipsdestroy.php +++ b/actions/apifriendshipsdestroy.php @@ -29,9 +29,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Allows the authenticating users to unfollow (unsubscribe) the user specified in @@ -48,7 +46,9 @@ if (!defined('STATUSNET')) { */ class ApiFriendshipsDestroyAction extends ApiAuthAction { - var $other = null; + protected $needPost = true; + + protected $other = null; /** * Take arguments for running @@ -58,12 +58,11 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction * @return boolean success flag * */ - function prepare($args) + protected function prepare(array $args=array()) { parent::prepare($args); - $this->user = $this->auth_user; - $this->other = $this->getTargetProfile($this->arg('id')); + $this->other = $this->getTargetProfile($this->arg('id')); return true; } @@ -73,58 +72,40 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction * * Check the format and show the user info * - * @param array $args $_REQUEST data (unused) - * * @return void */ - function handle($args) + protected function handle() { - parent::handle($args); - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError( - // TRANS: Client error. POST is a HTTP command. It should not be translated. - _('This method requires a POST.'), - 400, - $this->format - ); - return; - } + parent::handle(); if (!in_array($this->format, array('xml', 'json'))) { $this->clientError( // TRANS: Client error displayed when coming across a non-supported API method. _('API method not found.'), - 404, - $this->format + 404 ); - return; } - if (empty($this->other)) { + if (!$this->other instanceof Profile) { $this->clientError( // TRANS: Client error displayed when trying to unfollow a user that cannot be found. _('Could not unfollow user: User not found.'), - 403, - $this->format + 403 ); - return; } // Don't allow unsubscribing from yourself! - if ($this->user->id == $this->other->id) { + if ($this->scoped->id == $this->other->id) { $this->clientError( // TRANS: Client error displayed when trying to unfollow self. _("You cannot unfollow yourself."), - 403, - $this->format + 403 ); - return; } // throws an exception on error - Subscription::cancel($this->user->getProfile(), $this->other); + Subscription::cancel($this->scoped, $this->other); $this->initDocument($this->format); $this->showProfile($this->other, $this->format); From 901a825b6143b649f82e95cade8e8de1911151af Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 16:45:26 +0100 Subject: [PATCH 025/159] Non-functional "retweeted to me" API call modified (but not fixed) For some reason the "retweeted to me" part of the Twitter API was removed when Evan made some inbox changes back in the StatusNet days. We might recover this functionality, but not yet. The proper function calls are however fixed in this commit. --- actions/apitimelineretweetedtome.php | 26 +++++++++++--------------- classes/Profile.php | 6 ++++++ classes/User.php | 6 ++---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/actions/apitimelineretweetedtome.php b/actions/apitimelineretweetedtome.php index 85f52f7388..92d4b358fe 100644 --- a/actions/apitimelineretweetedtome.php +++ b/actions/apitimelineretweetedtome.php @@ -27,9 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Show most recent notices that are repeats in user's inbox @@ -59,7 +57,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction * * @return boolean success flag */ - function prepare($args) + protected function prepare(array $args=array()) { parent::prepare($args); @@ -79,35 +77,33 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction * * show a timeline of the user's repeated notices * - * @param array $args $_REQUEST data (unused) - * * @return void */ - function handle($args) + protected function handle() { - parent::handle($args); + parent::handle(); $offset = ($this->page-1) * $this->cnt; $limit = $this->cnt; // TRANS: Title for Atom feed "repeated to me". %s is the user nickname. - $title = sprintf(_("Repeated to %s"), $this->auth_user->nickname); + $title = sprintf(_("Repeated to %s"), $this->scoped->getNickname()); $subtitle = sprintf( // @todo FIXME: $profile is not defined. // TRANS: Subtitle for API action that shows most recent notices that are repeats in user's inbox. // TRANS: %1$s is the sitename, %2$s is a user nickname, %3$s is a user profile name. _('%1$s notices that were to repeated to %2$s / %3$s.'), - $sitename, $this->user->nickname, $profile->getBestName() + $sitename, $this->scoped->getNickname(), $profile->getBestName() ); $taguribase = TagURI::base(); - $id = "tag:$taguribase:RepeatedToMe:" . $this->auth_user->id; + $id = "tag:$taguribase:RepeatedToMe:" . $this->scoped->id; $link = common_local_url( 'all', - array('nickname' => $this->auth_user->nickname) + array('nickname' => $this->scoped->getNickname()) ); - $strm = $this->auth_user->repeatedToMe($offset, $limit, $this->since_id, $this->max_id); + $strm = $this->scoped->repeatedToMe($offset, $limit, $this->since_id, $this->max_id); switch ($this->format) { case 'xml': @@ -119,7 +115,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction case 'atom': header('Content-Type: application/atom+xml; charset=utf-8'); - $atom = new AtomNoticeFeed($this->auth_user); + $atom = new AtomNoticeFeed($this->scoped->getUser()); $atom->setId($id); $atom->setTitle($title); @@ -137,7 +133,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction break; case 'as': header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE); - $doc = new ActivityStreamJSONDocument($this->auth_user); + $doc = new ActivityStreamJSONDocument($this->scoped->getUser()); $doc->setTitle($title); $doc->addLink($link, 'alternate', 'text/html'); $doc->addItemsFromNotices($strm); diff --git a/classes/Profile.php b/classes/Profile.php index 0b608fbb24..6ae1b90011 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1451,6 +1451,12 @@ class Profile extends Managed_DataObject return $feed; } + public function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null) + { + // TRANS: Exception thrown when trying view "repeated to me". + throw new Exception(_('Not implemented since inbox change.')); + } + /* * Get a Profile object by URI. Will call external plugins for help * using the event StartGetProfileFromURI. diff --git a/classes/User.php b/classes/User.php index 7a19ae3a0a..6e42daa90c 100644 --- a/classes/User.php +++ b/classes/User.php @@ -687,11 +687,9 @@ class User extends Managed_DataObject return $stream->getNotices($offset, $limit, $since_id, $max_id); } - - function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null) + public function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null) { - // TRANS: Exception thrown when trying view "repeated to me". - throw new Exception(_('Not implemented since inbox change.')); + return $this->getProfile()->repeatedToMe($offset, $limit, $since_id, $max_id); } public static function siteOwner() From 61aa71ed34d944d6c4005fdeb33c2128d51eed9d Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 17:15:47 +0100 Subject: [PATCH 026/159] Subscription class gets exception throwing getSubscription function --- classes/Subscription.php | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/classes/Subscription.php b/classes/Subscription.php index 4d7eb524dc..cd9ae3cce5 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -232,9 +232,25 @@ class Subscription extends Managed_DataObject static function exists(Profile $subscriber, Profile $other) { - $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, - 'subscribed' => $other->id)); - return ($sub instanceof Subscription); + try { + $sub = self::getSubscription($subscriber, $other); + } catch (NoResultException $e) { + return false; + } + + return true; + } + + static function getSubscription(Profile $subscriber, Profile $other) + { + // This is essentially a pkeyGet but we have an object to return in NoResultException + $sub = new Subscription(); + $sub->subscriber = $subscriber->id; + $sub->subscribed = $other->id; + if (!$sub->find(true)) { + throw new NoResultException($sub); + } + return $sub; } function asActivity() From 6cdedf60492e61b2d8e7dc2d20172e3cfd43fca1 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 17:16:33 +0100 Subject: [PATCH 027/159] Replace $this->user/auth_user with $this->scoped in lib/apiaction.php We prefer handling a Profile class rather than the User class, as some functions might be useful for remote users as well, which cannot be handled via the User class. --- lib/apiaction.php | 69 +++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/lib/apiaction.php b/lib/apiaction.php index 5cebce33da..f1304a1d1e 100755 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -264,22 +264,20 @@ class ApiAction extends Action $twitter_user['statuses_count'] = $profile->noticeCount(); // Is the requesting user following this user? + // These values might actually also mean "unknown". Ambiguity issues? $twitter_user['following'] = false; $twitter_user['statusnet_blocking'] = false; $twitter_user['notifications'] = false; - if (isset($this->auth_user)) { - - $twitter_user['following'] = $this->auth_user->isSubscribed($profile); - $twitter_user['statusnet_blocking'] = $this->auth_user->hasBlocked($profile); - - // Notifications on? - $sub = Subscription::pkeyGet(array('subscriber' => - $this->auth_user->id, - 'subscribed' => $profile->id)); - - if ($sub) { + if ($this->scoped instanceof Profile) { + try { + $sub = Subscription::getSubscription($this->scoped, $profile); + // Notifications on? + $twitter_user['following'] = true; + $twitter_user['statusnet_blocking'] = $this->scoped->hasBlocked($profile); $twitter_user['notifications'] = ($sub->jabber || $sub->sms); + } catch (NoResultException $e) { + // well, the values are already false... } } @@ -430,11 +428,11 @@ class ApiAction extends Action $twitter_group['nickname'] = $group->nickname; $twitter_group['fullname'] = $group->fullname; - if (isset($this->auth_user)) { - $twitter_group['member'] = $this->auth_user->isMember($group); + if ($this->scoped instanceof Profile) { + $twitter_group['member'] = $this->scoped->isMember($group); $twitter_group['blocked'] = Group_block::isBlocked( $group, - $this->auth_user->getProfile() + $this->scoped ); } @@ -485,8 +483,8 @@ class ApiAction extends Action $twitter_list['member_count'] = $list->taggedCount(); $twitter_list['uri'] = $list->getUri(); - if (isset($this->auth_user)) { - $twitter_list['following'] = $list->hasSubscriber($this->auth_user); + if ($this->scoped instanceof Profile) { + $twitter_list['following'] = $list->hasSubscriber($this->scoped); } else { $twitter_list['following'] = false; } @@ -575,37 +573,30 @@ class ApiAction extends Action $relationship = array(); $relationship['source'] = - $this->relationshipDetailsArray($source, $target); + $this->relationshipDetailsArray($source->getProfile(), $target->getProfile()); $relationship['target'] = - $this->relationshipDetailsArray($target, $source); + $this->relationshipDetailsArray($target->getProfile(), $source->getProfile()); return array('relationship' => $relationship); } - function relationshipDetailsArray($source, $target) + function relationshipDetailsArray(Profile $source, Profile $target) { $details = array(); - $source_profile = $source->getProfile(); - $target_profile = $target->getProfile(); + $details['screen_name'] = $source->getNickname(); + $details['followed_by'] = $target->isSubscribed($source); - $details['screen_name'] = $source->nickname; - $details['followed_by'] = $target->isSubscribed($source_profile); - $details['following'] = $source->isSubscribed($target_profile); - - $notifications = false; - - if ($source->isSubscribed($target_profile)) { - $sub = Subscription::pkeyGet(array('subscriber' => - $source->id, 'subscribed' => $target->id)); - - if (!empty($sub)) { - $notifications = ($sub->jabber || $sub->sms); - } + try { + $sub = Subscription::getSubscription($source, $target); + $details['following'] = true; + $details['notifications_enabled'] = ($sub->jabber || $sub->sms); + } catch (NoResultException $e) { + $details['following'] = false; + $details['notifications_enabled'] = false; } - $details['notifications_enabled'] = $notifications; - $details['blocking'] = $source->hasBlocked($target_profile); + $details['blocking'] = $source->hasBlocked($target); $details['id'] = intval($source->id); return $details; @@ -788,7 +779,7 @@ class ApiAction extends Action function showSingleAtomStatus($notice) { header('Content-Type: application/atom+xml; charset=utf-8'); - print $notice->asAtomEntry(true, true, true, $this->auth_user); + print $notice->asAtomEntry(true, true, true, $this->scoped); } function show_single_json_status($notice) @@ -1352,7 +1343,7 @@ class ApiAction extends Action return User::getKV('nickname', $nickname); } else { // Fall back to trying the currently authenticated user - return $this->auth_user; + return $this->scoped->getUser(); } } else if (self::is_decimal($id)) { @@ -1448,7 +1439,7 @@ class ApiAction extends Action } if (!empty($list) && $list->private) { - if ($this->auth_user->id == $list->tagger) { + if ($this->scoped->id == $list->tagger) { return $list; } } else { From 282f4d6a8990a923ad2afb567b86a13d5300e1c1 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 17:17:32 +0100 Subject: [PATCH 028/159] Various $this->scoped fixes and protected prepare/handle in API actions --- actions/apifriendshipscreate.php | 8 +++----- actions/apifriendshipsexists.php | 16 +++++----------- actions/apifriendshipsshow.php | 12 ++++-------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/actions/apifriendshipscreate.php b/actions/apifriendshipscreate.php index 873883c651..e7caf96869 100644 --- a/actions/apifriendshipscreate.php +++ b/actions/apifriendshipscreate.php @@ -29,9 +29,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Allows the authenticating users to follow (subscribe) the user specified in @@ -90,7 +88,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction $this->clientError(_('Could not follow user: profile not found.'), 403); } - if ($this->user->isSubscribed($this->other)) { + if ($this->scoped->isSubscribed($this->other)) { $errmsg = sprintf( // TRANS: Client error displayed when trying to follow a user that's already being followed. // TRANS: %s is the nickname of the user that is already being followed. @@ -101,7 +99,7 @@ class ApiFriendshipsCreateAction extends ApiAuthAction } try { - Subscription::start($this->user->getProfile(), $this->other); + Subscription::start($this->scoped, $this->other); } catch (Exception $e) { $this->clientError($e->getMessage(), 403); } diff --git a/actions/apifriendshipsexists.php b/actions/apifriendshipsexists.php index 1f76e00b1a..4bb771292d 100644 --- a/actions/apifriendshipsexists.php +++ b/actions/apifriendshipsexists.php @@ -29,9 +29,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Tests for the existence of friendship between two users. Will return true if @@ -57,7 +55,7 @@ class ApiFriendshipsExistsAction extends ApiPrivateAuthAction * * @return boolean success flag */ - function prepare($args) + protected function prepare(array $args=array()) { parent::prepare($args); @@ -72,22 +70,18 @@ class ApiFriendshipsExistsAction extends ApiPrivateAuthAction * * Check the format and show the user info * - * @param array $args $_REQUEST data (unused) - * * @return void */ - function handle($args) + protected function handle() { - parent::handle($args); + parent::handle(); if (empty($this->profile_a) || empty($this->profile_b)) { $this->clientError( // TRANS: Client error displayed when supplying invalid parameters to an API call checking if a friendship exists. _('Two valid IDs or nick names must be supplied.'), - 400, - $this->format + 400 ); - return; } $result = Subscription::exists($this->profile_a, $this->profile_b); diff --git a/actions/apifriendshipsshow.php b/actions/apifriendshipsshow.php index 5810e14874..c08e984b9a 100644 --- a/actions/apifriendshipsshow.php +++ b/actions/apifriendshipsshow.php @@ -29,9 +29,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Outputs detailed information about the relationship between two users @@ -56,7 +54,7 @@ class ApiFriendshipsShowAction extends ApiBareAuthAction * * @return boolean success flag */ - function prepare($args) + protected function prepare(array $args=array()) { parent::prepare($args); @@ -109,13 +107,11 @@ class ApiFriendshipsShowAction extends ApiBareAuthAction * * Check the format and show the user info * - * @param array $args $_REQUEST data (unused) - * * @return void */ - function handle($args) + protected function handle() { - parent::handle($args); + parent::handle(); if (!in_array($this->format, array('xml', 'json'))) { // TRANS: Client error displayed when coming across a non-supported API method. From 59763ceecb33ebf842829cac15f922fa19047de2 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 17:35:45 +0100 Subject: [PATCH 029/159] SalmonAction now updates remote URI if it was stale. After doublechecking two identities so that they match (like one that was previously http:// but now is https://) we update the URI in our database to match. This has to be verified so it's not easy to fool our script and thus make us replace legitimate URIs with fake ones. I believe the callback method is safe, but I'm not sure how well it handles HTTP MITM attacks etc. --- plugins/OStatus/lib/salmonaction.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 5e7d8f35a3..365f2c829c 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -245,7 +245,12 @@ class SalmonAction extends Action // Step 4: Is the newly introduced https://example.com/user/1 URI in the list of aliases // presented by http://example.com/user/1 (i.e. do they both say they are the same identity?) if (in_array($e->object_uri, $doublecheck_aliases)) { - common_debug('These identities both say they are each other: "'.$aliased_uri.'" and "'.$e->object_uri); + common_debug('URIFIX These identities both say they are each other: "'.$aliased_uri.'" and "'.$e->object_uri.'"'); + $orig = clone($oprofile); + $oprofile->uri = $e->object_uri; + common_debug('URIFIX Updating Ostatus_profile URI for '.$aliased_uri.' to '.$oprofile->uri); + $oprofile->updateWithKeys($orig); + unset($orig); $this->oprofile = $oprofile; break; // don't iterate through aliases anymore } From 5a8f24eb46a3f4c5209c496918066bdbdcb4ec82 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 18:55:12 +0100 Subject: [PATCH 030/159] urlhash first steps, including scripts/upgrade.php --- classes/File.php | 34 ++++++++++++++++++++++++---------- scripts/upgrade.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/classes/File.php b/classes/File.php index ce2f940161..dad54166b1 100644 --- a/classes/File.php +++ b/classes/File.php @@ -26,7 +26,8 @@ class File extends Managed_DataObject { public $__table = 'file'; // table name public $id; // int(4) primary_key not_null - public $url; // varchar(255) unique_key + public $urlhash; // varchar(64) unique_key + public $url; // text public $mimetype; // varchar(50) public $size; // int(4) public $title; // varchar(255) @@ -37,12 +38,15 @@ class File extends Managed_DataObject public $height; // int(4) public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + const URLHASH_ALG = 'sha256'; + public static function schemaDef() { return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'destination URL after following redirections'), + 'urlhash' => array('type' => 'varchar', 'length' => 64, 'description' => 'sha256 of destination URL (url field)'), + 'url' => array('type' => 'text', 'description' => 'destination URL after following redirections'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'size' => array('type' => 'int', 'description' => 'size of resource when available'), 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of resource when available'), @@ -56,7 +60,7 @@ class File extends Managed_DataObject ), 'primary key' => array('id'), 'unique keys' => array( - 'file_url_key' => array('url'), + 'file_urlhash_key' => array('urlhash'), ), ); } @@ -77,10 +81,11 @@ class File extends Managed_DataObject // I don't know why we have to keep doing this but I'm adding this last check to avoid // uniqueness bugs. - $file = File::getKV('url', $given_url); + $file = File::getKV('urlhash', self::hashurl($given_url)); if (!$file instanceof File) { $file = new File; + $file->urlhash = self::hashurl($given_url); $file->url = $given_url; if (!empty($redir_data['protected'])) $file->protected = $redir_data['protected']; if (!empty($redir_data['title'])) $file->title = $redir_data['title']; @@ -462,7 +467,7 @@ class File extends Managed_DataObject if (!empty($this->filename)) { // A locally stored file, so let's generate a URL for our instance. $url = self::url($this->filename); - if ($url != $this->url) { + if (self::urlhash($url) !== $this->urlhash) { // For indexing purposes, in case we do a lookup on the 'url' field. // also we're fixing possible changes from http to https, or paths $this->updateUrl($url); @@ -476,14 +481,15 @@ class File extends Managed_DataObject public function updateUrl($url) { - $file = File::getKV('url', $url); + $file = File::getKV('urlhash', self::hashurl($url)); if ($file instanceof File) { throw new ServerException('URL already exists in DB'); } - $sql = 'UPDATE %1$s SET url=%2$s WHERE url=%3$s;'; + $sql = 'UPDATE %1$s SET urlhash=%2$s, url=%3$s WHERE urlhash=%4$s;'; $result = $this->query(sprintf($sql, $this->__table, + $this->_quote((string)self::hashurl($url)), $this->_quote((string)$url), - $this->_quote((string)$this->url))); + $this->_quote((string)$this->urlhash))); if ($result === false) { common_log_db_error($this, 'UPDATE', __FILE__); throw new ServerException("Could not UPDATE {$this->__table}.url"); @@ -502,9 +508,9 @@ class File extends Managed_DataObject function blowCache($last=false) { - self::blow('file:notice-ids:%s', $this->url); + self::blow('file:notice-ids:%s', $this->urlhash); if ($last) { - self::blow('file:notice-ids:%s;last', $this->url); + self::blow('file:notice-ids:%s;last', $this->urlhash); } self::blow('file:notice-count:%d', $this->id); } @@ -582,4 +588,12 @@ class File extends Managed_DataObject return $title ?: null; } + + static public function hashurl($url) + { + if (empty($url)) { + throw new Exception('No URL provided to hash algorithm.'); + } + return hash(self::URLHASH_ALG, $url); + } } diff --git a/scripts/upgrade.php b/scripts/upgrade.php index c221a495af..eeddf5559f 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -76,6 +76,7 @@ function updateSchemaCore() $schema = Schema::get(); $schemaUpdater = new SchemaUpdater($schema); foreach (tableDefs() as $table => $def) { + preAlterFixes($schemaUpdater, $table); $schemaUpdater->register($table, $def); } $schemaUpdater->checkSchema(); @@ -83,6 +84,40 @@ function updateSchemaCore() printfnq("DONE.\n"); } +function preAlterFixes($schemaUpdater, $table) +{ + switch ($table) { + case 'file': + $schemadef = $schemaUpdater->schema->getTableDef($table); + if (isset($schemadef['fields']['urlhash'])) { + // We already have the urlhash field, so no need to migrate it. + break; + } + printfnq("\nFound old $table table, upgrading it to contain 'urlhash' field...\n"); + // We have to create a urlhash that is _not_ the primary key, + // transfer data and THEN run checkSchema + $schemadef['fields']['urlhash'] = array ( + 'type' => 'varchar', + 'length' => 64, + 'description' => 'sha256 of destination URL after following redirections', + ); + $schemaUpdater->schema->ensureTable($table, $schemadef); + printfnq("DONE.\n"); + + $filefix = new File(); + // urlhash is hash('sha256', $url) in the File table + printfnq("Updating urlhash fields in $table table...\n"); + $filefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', + $schemaUpdater->schema->quoteIdentifier($table), + 'urlhash', + // The line below is "result of sha256 on column `url`" + 'SHA2(url, 256)')); + printfnq("DONE.\n"); + printfnq("Resuming core schema upgrade..."); + break; + } +} + function updateSchemaPlugins() { printfnq("Upgrading plugin schema..."); From c31c2d10b972b9efc750fcec28acdd90da81a4cd Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 20:11:35 +0100 Subject: [PATCH 031/159] PHP>=5.4.0 lets us use Transliterator, tags now asciified! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example: #REVOLUCIร“N becomes #revolucion instead of #revoluciรณn --- lib/util.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/util.php b/lib/util.php index a32c35395e..b81aa5ef35 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1116,6 +1116,20 @@ function common_xml_safe_str($str) return preg_replace('/[\p{Cc}\p{Cs}]/u', '*', $str); } +function common_slugify($str) +{ + $str = transliterator_transliterate( + 'Any-Latin;' . // any charset to latin compatible + 'NFD;' . // decompose + '[:Nonspacing Mark:] Remove;' . // remove nonspacing marks (accents etc.) + 'NFC;' . // composite again + '[:Punctuation:] Remove;' . // remove punctuation (.,ยฟ? etc.) + 'Lower();' . // turn into lowercase + 'Latin-ASCII;', // get ASCII equivalents (รฐ to d for example) + $str); + return preg_replace('/[^\pL\pN]/', '', $str); +} + function common_tag_link($tag) { $canonical = common_canonical_tag($tag); @@ -1139,11 +1153,9 @@ function common_tag_link($tag) function common_canonical_tag($tag) { - // only alphanum - $tag = preg_replace('/[^\pL\pN]/u', '', $tag); - $tag = mb_convert_case($tag, MB_CASE_LOWER, "UTF-8"); - $tag = substr($tag, 0, 64); - return $tag; + $tag = common_slugify($tag); + $tag = substr($tag, 0, 64); + return $tag; } function common_valid_profile_tag($str) From 7ba7f4319952a38570c36dc083e4c83f01447cb1 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 17 Feb 2015 20:54:32 +0100 Subject: [PATCH 032/159] Don't linkify bare domains by default It's too farfetched to assume any text.com in a notice is an HTTP URL. For example stuff like pasting from log entries, with domain.com:1234 where 1234 is a _PID_ or something, not a port number for http://... --- lib/default.php | 3 +++ lib/util.php | 15 +++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/default.php b/lib/default.php index 6ca61f191b..b1c6d5ea33 100644 --- a/lib/default.php +++ b/lib/default.php @@ -207,6 +207,9 @@ $default = 'newuser' => array('default' => null, 'welcome' => null), + 'linkify' => array( + 'bare_domains' => false, // convert domain.com to domain.com ? + ), 'attachments' => array('server' => null, 'dir' => INSTALLDIR . '/file/', diff --git a/lib/util.php b/lib/util.php index b81aa5ef35..eb3750ff5f 100644 --- a/lib/util.php +++ b/lib/util.php @@ -870,12 +870,15 @@ function common_replace_urls_callback($text, $callback, $arg = null) { '|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'. //IPv4 '|(?:'. //IPv6 '\[?(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:(?:[0-9A-Fa-f]{1,4})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(?::[0-9A-Fa-f]{1,4})))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?::[0-9A-Fa-f]{1,4}){0,1}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?::[0-9A-Fa-f]{1,4}){0,2}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?::[0-9A-Fa-f]{1,4}){0,3}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:)(?::[0-9A-Fa-f]{1,4}){0,4}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?::(?::[0-9A-Fa-f]{1,4}){0,5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))\]?(? Date: Tue, 17 Feb 2015 21:31:35 +0100 Subject: [PATCH 033/159] forgot primary key column to updateWithKeys in SalmonAction --- plugins/OStatus/lib/salmonaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 365f2c829c..2954d8038c 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -249,7 +249,7 @@ class SalmonAction extends Action $orig = clone($oprofile); $oprofile->uri = $e->object_uri; common_debug('URIFIX Updating Ostatus_profile URI for '.$aliased_uri.' to '.$oprofile->uri); - $oprofile->updateWithKeys($orig); + $oprofile->updateWithKeys($orig, 'uri'); // 'uri' is the primary key column unset($orig); $this->oprofile = $oprofile; break; // don't iterate through aliases anymore From 3dce6d9f6a1a95c42cdc1762140528323c71b08f Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 00:10:31 +0100 Subject: [PATCH 034/159] Implement a common_purify for htmLawed and more We're removing unicode formatting characters as well, such as RTL marks. For more info on why we're because extra cautious (but may accept the characters in later versions) you can read: https://blog.malwarebytes.org/online-security/2014/01/the-rtlo-method/ --- lib/util.php | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/util.php b/lib/util.php index eb3750ff5f..9a70d8d44e 100644 --- a/lib/util.php +++ b/lib/util.php @@ -576,6 +576,25 @@ function common_canonical_email($email) return $email; } +function common_purify($html) +{ + require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; + + $config = array('safe' => 1, + 'deny_attribute' => 'id,style,on*'); + + $html = common_remove_unicode_formatting($html); + + return htmLawed($html, $config); +} + +function common_remove_unicode_formatting($text) +{ + // Strip Unicode text formatting/direction codes + // this is pretty dangerous for visualisation of text and can be used for mischief + return preg_replace('/[\\x{200b}-\\x{200f}\\x{202a}-\\x{202e}]/u', '', $text); +} + /** * Partial notice markup rendering step: build links to !group references. * @@ -585,9 +604,9 @@ function common_canonical_email($email) */ function common_render_content($text, Notice $notice) { - $r = common_render_text($text); - $r = common_linkify_mentions($r, $notice); - return $r; + $text = common_render_text($text); + $text = common_linkify_mentions($text, $notice); + return $text; } /** @@ -829,14 +848,15 @@ function common_find_mentions_raw($text) function common_render_text($text) { - $r = nl2br(htmlspecialchars($text)); + $text = common_remove_unicode_formatting($text); + $text = nl2br(htmlspecialchars($text)); - $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r); - $r = common_replace_urls_callback($r, 'common_linkify'); - $r = preg_replace_callback('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/u', - function ($m) { return "{$m[1]}#".common_tag_link($m[2]); }, $r); + $text = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $text); + $text = common_replace_urls_callback($text, 'common_linkify'); + $text = preg_replace_callback('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/u', + function ($m) { return "{$m[1]}#".common_tag_link($m[2]); }, $text); // XXX: machine tags - return $r; + return $text; } /** From 0deaf6c50c0a02dd307b797729adbaf2a973db07 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 00:14:28 +0100 Subject: [PATCH 035/159] use common_purify to purify HTML, one function to rule them all --- actions/apitimelineuser.php | 11 +---------- lib/activityimporter.php | 13 +------------ plugins/Blog/classes/Blog_entry.php | 18 ++---------------- plugins/OStatus/classes/Ostatus_profile.php | 15 ++------------- 4 files changed, 6 insertions(+), 51 deletions(-) diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index 26c960fa04..abc7fd6a96 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -405,7 +405,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction // Get (safe!) HTML and text versions of the content - $rendered = $this->purify($sourceContent); + $rendered = common_purify($sourceContent); $content = common_strip_html($rendered); $shortened = $this->auth_user->shortenLinks($content); @@ -504,13 +504,4 @@ class ApiTimelineUserAction extends ApiBareAuthAction return $saved; } - - function purify($content) - { - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*'); - return htmLawed($content, $config); - } } diff --git a/lib/activityimporter.php b/lib/activityimporter.php index 4e13419ae7..5bef4cfb07 100644 --- a/lib/activityimporter.php +++ b/lib/activityimporter.php @@ -213,7 +213,7 @@ class ActivityImporter extends QueueHandler // Get (safe!) HTML and text versions of the content - $rendered = $this->purify($sourceContent); + $rendered = common_purify($sourceContent); $content = common_strip_html($rendered); $shortened = $user->shortenLinks($content); @@ -338,15 +338,4 @@ class ActivityImporter extends QueueHandler return array($groups, $replies); } - - - function purify($content) - { - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*'); - - return htmLawed($content, $config); - } } diff --git a/plugins/Blog/classes/Blog_entry.php b/plugins/Blog/classes/Blog_entry.php index 1f585dce4f..6b82a0fdd1 100644 --- a/plugins/Blog/classes/Blog_entry.php +++ b/plugins/Blog/classes/Blog_entry.php @@ -117,10 +117,10 @@ class Blog_entry extends Managed_DataObject $be->id = (string) new UUID(); $be->profile_id = $profile->id; $be->title = $title; // Note: not HTML-protected - $be->content = self::purify($content); + $be->content = common_purify($content); if (array_key_exists('summary', $options)) { - $be->summary = self::purify($options['summary']); + $be->summary = common_purify($options['summary']); } else { // Already purified $be->summary = self::summarize($be->content); @@ -241,18 +241,4 @@ class Blog_entry extends Managed_DataObject return $obj; } - - /** - * Clean up input HTML - */ - static function purify($html) - { - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*'); - $pure = htmLawed($html, $config); - - return $pure; - } } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 79098c6404..4be4e5112f 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -621,7 +621,7 @@ class Ostatus_profile extends Managed_DataObject // Get (safe!) HTML and text versions of the content - $rendered = $this->purify($sourceContent); + $rendered = common_purify($sourceContent); $content = common_strip_html($rendered); $shortened = common_shorten_links($content); @@ -788,7 +788,7 @@ class Ostatus_profile extends Managed_DataObject // Get (safe!) HTML and text versions of the content - $rendered = $this->purify($sourceContent); + $rendered = common_purify($sourceContent); $content = common_strip_html($rendered); $shortened = common_shorten_links($content); @@ -914,17 +914,6 @@ class Ostatus_profile extends Managed_DataObject return $saved; } - /** - * Clean up HTML - */ - protected function purify($html) - { - require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*'); - return htmLawed($html, $config); - } - /** * Filters a list of recipient ID URIs to just those for local delivery. * @param Profile local profile of sender From 8fbdb4b9ac7f7ff9da8c7152a7ec1fad1116260e Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 00:28:45 +0100 Subject: [PATCH 036/159] New dependency: php5-intl Internationalization support is required for transliteration, which is currently used when creating the slugs for hashtags and such. It is a much more stable and efficient solution than having an unmaintainable list of unciode characters in an array... --- INSTALL | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL b/INSTALL index 0483320a78..fff63681be 100644 --- a/INSTALL +++ b/INSTALL @@ -41,6 +41,7 @@ functional setup of GNU Social: - php5-curl Fetching files by HTTP. - php5-gd Image manipulation (scaling). - php5-gmp For Salmon signatures (part of OStatus). +- php5-intl Internationalization support (transliteration et al). - php5-json For WebFinger lookups and more. - php5-mysqlnd The native driver for PHP5 MariaDB connections. If you use MySQL, 'mysql' or 'mysqli' may work. From 66df043c19a195abcc14405631fb279304a4d525 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 00:47:00 +0100 Subject: [PATCH 037/159] Add php5-intl dependency to Installer class --- lib/installer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/installer.php b/lib/installer.php index cea7d29ec7..1fcd0961c5 100644 --- a/lib/installer.php +++ b/lib/installer.php @@ -101,7 +101,7 @@ abstract class Installer $pass = false; } - $reqs = array('gd', 'curl', 'json', + $reqs = array('gd', 'curl', 'intl', 'json', 'xmlwriter', 'mbstring', 'xml', 'dom', 'simplexml'); foreach ($reqs as $req) { From b039d960f50dc0307e85604009ba4b10717a1d75 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 11:08:11 +0100 Subject: [PATCH 038/159] Make group search in Directory use PEAR::DB No more direct SQL queries please. --- plugins/Directory/actions/groupdirectory.php | 31 +++++++++----------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/plugins/Directory/actions/groupdirectory.php b/plugins/Directory/actions/groupdirectory.php index 5e532fc214..496f035570 100644 --- a/plugins/Directory/actions/groupdirectory.php +++ b/plugins/Directory/actions/groupdirectory.php @@ -27,12 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) -{ - exit(1); -} - -require_once INSTALLDIR . '/lib/publicgroupnav.php'; +if (!defined('GNUSOCIAL')) { exit(1); } /** * Group directory @@ -40,6 +35,7 @@ require_once INSTALLDIR . '/lib/publicgroupnav.php'; * @category Directory * @package StatusNet * @author Zach Copley + * @author Mikael Nordfeldth * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -308,6 +304,14 @@ class GroupdirectoryAction extends Action if (isset($this->q)) { + // Disable this to get global group searches + $group->joinAdd(array('id', 'local_group:group_id')); + + $wheres = array('nickname', 'fullname', 'homepage', 'description', 'location'); + foreach ($wheres as $where) { + $group->whereAdd("LOWER({$group->__table}.{$where}) LIKE LOWER('%".$group->escape($this->q)."%')", 'OR'); + } + $order = 'user_group.created ASC'; if ($this->sort == 'nickname') { @@ -322,17 +326,8 @@ class GroupdirectoryAction extends Action } } - $sql = <<< GROUP_QUERY_END -SELECT user_group.* -FROM user_group -JOIN local_group ON user_group.id = local_group.group_id -ORDER BY %s -LIMIT %d, %d -GROUP_QUERY_END; - - $cnt = 0; - $group->query(sprintf($sql, $order, $limit, $offset)); - $group->find(); + $group->orderBy($order); + $group->limit($offset, $limit); } else { // User is browsing via AlphaNav @@ -371,6 +366,8 @@ GROUP_QUERY_END; $group->query($sql); } + $group->find(); + return $group; } From 52e0ce8b064735a44a8d0297cc5ced01e7c3db0b Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 11:13:10 +0100 Subject: [PATCH 039/159] Directory group search code cleanup --- plugins/Directory/actions/groupdirectory.php | 22 ++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/plugins/Directory/actions/groupdirectory.php b/plugins/Directory/actions/groupdirectory.php index 496f035570..1abf4144b1 100644 --- a/plugins/Directory/actions/groupdirectory.php +++ b/plugins/Directory/actions/groupdirectory.php @@ -302,7 +302,7 @@ class GroupdirectoryAction extends Action $offset = ($this->page-1) * PROFILES_PER_PAGE; $limit = PROFILES_PER_PAGE + 1; - if (isset($this->q)) { + if (!empty($this->q)) { // Disable this to get global group searches $group->joinAdd(array('id', 'local_group:group_id')); @@ -312,19 +312,15 @@ class GroupdirectoryAction extends Action $group->whereAdd("LOWER({$group->__table}.{$where}) LIKE LOWER('%".$group->escape($this->q)."%')", 'OR'); } - $order = 'user_group.created ASC'; + $order = "{$group->__table}.created ASC"; - if ($this->sort == 'nickname') { - if ($this->reverse) { - $order = 'user_group.nickname DESC'; - } else { - $order = 'user_group.nickname ASC'; - } - } else { - if ($this->reverse) { - $order = 'user_group.created DESC'; - } - } + if ($this->sort == 'nickname') { + $order = $this->reverse + ? "{$group->__table}.nickname DESC" + : "{$group->__table}.nickname ASC"; + } elseif ($this->reverse) { + $order = "{$group->__table}.created DESC"; + } $group->orderBy($order); $group->limit($offset, $limit); From a254f38a238179a88b08149e5dc44052cf4dd399 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 11:15:30 +0100 Subject: [PATCH 040/159] Turn GroupdirectoryAction into a ManagedAction --- plugins/Directory/actions/groupdirectory.php | 28 ++------------------ 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/plugins/Directory/actions/groupdirectory.php b/plugins/Directory/actions/groupdirectory.php index 1abf4144b1..053516b793 100644 --- a/plugins/Directory/actions/groupdirectory.php +++ b/plugins/Directory/actions/groupdirectory.php @@ -39,7 +39,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GroupdirectoryAction extends Action +class GroupdirectoryAction extends ManagedAction { /** * The page we're on @@ -134,17 +134,8 @@ class GroupdirectoryAction extends Action return true; } - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - */ - function prepare($args) + protected function doPreparation() { - parent::prepare($args); - $this->page = ($this->arg('page')) ? ($this->arg('page') + 0) : 1; $this->filter = $this->arg('filter', 'all'); $this->reverse = $this->boolean('reverse'); @@ -156,21 +147,6 @@ class GroupdirectoryAction extends Action return true; } - /** - * Handle request - * - * Shows the page - * - * @param array $args $_REQUEST args; handled in prepare() - * - * @return void - */ - function handle($args) - { - parent::handle($args); - $this->showPage(); - } - /** * Show the page notice * From 94e19e1ac6bdd0332b45e95e802d9009aa122465 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 12:15:46 +0100 Subject: [PATCH 041/159] escapedTableName for SQL query easy access --- classes/Managed_DataObject.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index a628b8bee3..dc4352270d 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -299,6 +299,11 @@ abstract class Managed_DataObject extends Memcached_DataObject return $ckeys; } + public function escapedTableName() + { + return common_database_tablename($this->tableName()); + } + /** * Returns an ID, checked that it is set and reasonably valid * From e64ac4c418ffc0a0145fd292ddc2abd65fc79988 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 12:17:26 +0100 Subject: [PATCH 042/159] GroupdirectoryAction now has no direct SQL queries also various fixes uppers --- plugins/Directory/actions/groupdirectory.php | 85 +++++++++----------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/plugins/Directory/actions/groupdirectory.php b/plugins/Directory/actions/groupdirectory.php index 053516b793..f6b20d0cf5 100644 --- a/plugins/Directory/actions/groupdirectory.php +++ b/plugins/Directory/actions/groupdirectory.php @@ -275,69 +275,59 @@ class GroupdirectoryAction extends ManagedAction { $group = new User_group(); - $offset = ($this->page-1) * PROFILES_PER_PAGE; - $limit = PROFILES_PER_PAGE + 1; + // Disable this to get global group searches + $group->joinAdd(array('id', 'local_group:group_id')); + + $order = false; if (!empty($this->q)) { - - // Disable this to get global group searches - $group->joinAdd(array('id', 'local_group:group_id')); - $wheres = array('nickname', 'fullname', 'homepage', 'description', 'location'); foreach ($wheres as $where) { - $group->whereAdd("LOWER({$group->__table}.{$where}) LIKE LOWER('%".$group->escape($this->q)."%')", 'OR'); + // Double % because of sprintf + $group->whereAdd(sprintf('LOWER(%1$s.%2$s) LIKE LOWER("%%%3$s%%")', + $group->escapedTableName(), $where, + $group->escape($this->q)), + 'OR'); } - $order = "{$group->__table}.created ASC"; - - if ($this->sort == 'nickname') { - $order = $this->reverse - ? "{$group->__table}.nickname DESC" - : "{$group->__table}.nickname ASC"; - } elseif ($this->reverse) { - $order = "{$group->__table}.created DESC"; - } - - $group->orderBy($order); - $group->limit($offset, $limit); - + $order = sprintf('%1$s.%2$s %3$s', + $group->escapedTableName(), + $this->getSortKey('created'), + $this->reverse ? 'DESC' : 'ASC'); } else { // User is browsing via AlphaNav - $sort = $this->getSortKey(); - $sql = <<< GROUP_QUERY_END -SELECT user_group.* -FROM user_group -JOIN local_group ON user_group.id = local_group.group_id -GROUP_QUERY_END; - - switch($this->filter) - { + switch($this->filter) { case 'all': // NOOP break; case '0-9': - $sql .= - ' AND LEFT(user_group.nickname, 1) BETWEEN \'0\' AND \'9\''; + $group->whereAdd(sprintf('LEFT(%1$s.%2$s, 1) BETWEEN %3$s AND %4$s', + $group->escapedTableName(), + 'nickname', + $group->_quote("0"), + $group->_quote("9"))); break; default: - $sql .= sprintf( - ' AND LEFT(LOWER(user_group.nickname), 1) = \'%s\'', - $this->filter - ); + $group->whereAdd(sprintf('LEFT(LOWER(%1$s.%2$s), 1) = %3$s', + $group->escapedTableName(), + 'nickname', + $group->_quote($this->filter))); } - $sql .= sprintf( - ' ORDER BY user_group.%s %s, user_group.nickname ASC LIMIT %d, %d', - $sort, - $this->reverse ? 'DESC' : 'ASC', - $offset, - $limit - ); - - $group->query($sql); + $order = sprintf('%1$s.%2$s %3$s, %1$s.%4$s ASC', + $group->escapedTableName(), + $this->getSortKey('nickname'), + $this->reverse ? 'DESC' : 'ASC', + 'nickname'); } + $offset = ($this->page-1) * PROFILES_PER_PAGE; + $limit = PROFILES_PER_PAGE + 1; + + $group->orderBy($order); + $group->limit($offset, $limit); + $group->find(); return $group; @@ -348,17 +338,14 @@ GROUP_QUERY_END; * * @return string a column name for sorting */ - function getSortKey() + function getSortKey($def='created') { switch ($this->sort) { case 'nickname': - return $this->sort; - break; case 'created': return $this->sort; - break; default: - return 'nickname'; + return $def; } } From d445e0c8773e3ca74c3515ee8f54327a9363a24c Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 13:18:32 +0100 Subject: [PATCH 043/159] No need for return true --- plugins/Directory/actions/groupdirectory.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/Directory/actions/groupdirectory.php b/plugins/Directory/actions/groupdirectory.php index f6b20d0cf5..32e5ce50b4 100644 --- a/plugins/Directory/actions/groupdirectory.php +++ b/plugins/Directory/actions/groupdirectory.php @@ -143,8 +143,6 @@ class GroupdirectoryAction extends ManagedAction $this->sort = $this->arg('sort', 'nickname'); common_set_returnto($this->selfUrl()); - - return true; } /** From 4ad7e8f459961bebeea06b0bb636499650ca1043 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 13:37:06 +0100 Subject: [PATCH 044/159] UserdirectoryAction now ManagedAction and better SQL --- plugins/Directory/actions/userdirectory.php | 83 +++++++-------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/plugins/Directory/actions/userdirectory.php b/plugins/Directory/actions/userdirectory.php index 77ffb5206b..f178408e8b 100644 --- a/plugins/Directory/actions/userdirectory.php +++ b/plugins/Directory/actions/userdirectory.php @@ -27,12 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) -{ - exit(1); -} - -require_once INSTALLDIR . '/lib/publicgroupnav.php'; +if (!defined('GNUSOCIAL')) { exit(1); } /** * User directory @@ -43,7 +38,7 @@ require_once INSTALLDIR . '/lib/publicgroupnav.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class UserdirectoryAction extends Action +class UserdirectoryAction extends ManagedAction { /** * The page we're on @@ -137,17 +132,8 @@ class UserdirectoryAction extends Action return true; } - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - */ - function prepare($args) + protected function doPreparation() { - parent::prepare($args); - $this->page = ($this->arg('page')) ? ($this->arg('page') + 0) : 1; $this->filter = $this->arg('filter', 'all'); $this->reverse = $this->boolean('reverse'); @@ -155,23 +141,6 @@ class UserdirectoryAction extends Action $this->sort = $this->arg('sort', 'nickname'); common_set_returnto($this->selfUrl()); - - return true; - } - - /** - * Handle request - * - * Shows the page - * - * @param array $args $_REQUEST args; handled in prepare() - * - * @return void - */ - function handle($args) - { - parent::handle($args); - $this->showPage(); } /** @@ -291,10 +260,13 @@ class UserdirectoryAction extends Action { $profile = new Profile(); + // Comment this out or disable to get global profile searches + $profile->joinAdd(array('id', 'user:id')); + $offset = ($this->page - 1) * PROFILES_PER_PAGE; $limit = PROFILES_PER_PAGE + 1; - if (isset($this->q)) { + if (!empty($this->q)) { // User is searching via query $search_engine = $profile->getSearchEngine('profile'); @@ -319,34 +291,34 @@ class UserdirectoryAction extends Action $profile->find(); } else { // User is browsing via AlphaNav - $sort = $this->getSortKey(); - $sql = 'SELECT profile.* FROM profile, user WHERE profile.id = user.id'; - switch($this->filter) - { + switch ($this->filter) { case 'all': // NOOP break; case '0-9': - $sql .= - ' AND LEFT(profile.nickname, 1) BETWEEN \'0\' AND \'9\''; + $profile->whereAdd(sprintf('LEFT(%1$s.%2$s, 1) BETWEEN %3$s AND %4$s', + $profile->escapedTableName(), + 'nickname', + $profile->_quote("0"), + $profile->_quote("9"))); break; default: - $sql .= sprintf( - ' AND LEFT(LOWER(profile.nickname), 1) = \'%s\'', - $this->filter - ); + $profile->whereAdd(sprintf('LEFT(LOWER(%1$s.%2$s), 1) = %3$s', + $profile->escapedTableName(), + 'nickname', + $profile->_quote($this->filter))); } - $sql .= sprintf( - ' ORDER BY profile.%s %s, profile.nickname ASC LIMIT %d, %d', - $sort, - $this->reverse ? 'DESC' : 'ASC', - $offset, - $limit - ); + $order = sprintf('%1$s.%2$s %3$s, %1$s.%4$s ASC', + $profile->escapedTableName(), + $this->getSortKey('nickname'), + $this->reverse ? 'DESC' : 'ASC', + 'nickname'); + $profile->orderBy($order); + $profile->limit($offset, $limit); - $profile->query($sql); + $profile->find(); } return $profile; @@ -357,15 +329,12 @@ class UserdirectoryAction extends Action * * @return string a column name for sorting */ - function getSortKey() + function getSortKey($def='nickname') { switch ($this->sort) { case 'nickname': - return $this->sort; - break; case 'created': return $this->sort; - break; default: return 'nickname'; } From 0acf3e0e30dbe9b127f5e307619e7ee72eb4e9cc Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 18 Feb 2015 14:01:35 +0100 Subject: [PATCH 045/159] Profile table cleaning script. --- scripts/clean_profiles.php | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 scripts/clean_profiles.php diff --git a/scripts/clean_profiles.php b/scripts/clean_profiles.php new file mode 100755 index 0000000000..470d6c1b91 --- /dev/null +++ b/scripts/clean_profiles.php @@ -0,0 +1,59 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'y'; +$longoptions = array('yes'); + +$helptext = <<query('SELECT * FROM profile WHERE ' . + 'NOT (SELECT COUNT(*) FROM notice WHERE profile_id=profile.id) ' . + 'AND NOT (SELECT COUNT(*) FROM user WHERE user.id=profile.id) ' . + 'AND NOT (SELECT COUNT(*) FROM user_group WHERE user_group.profile_id=profile.id) ' . + 'AND NOT (SELECT COUNT(*) FROM subscription WHERE subscriber=profile.id OR subscribed=profile.id) '); +while ($profile->fetch()) { + echo ' '.$profile->getID().':'.$profile->getNickname(); + $profile->delete(); +} +print "\nDONE.\n"; From 042cb1604a45fbce0878c113bfc997d899e276d0 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 17:42:47 +0100 Subject: [PATCH 046/159] ROLLBACK if query failed in email settings savePreferences --- actions/emailsettings.php | 1 + 1 file changed, 1 insertion(+) diff --git a/actions/emailsettings.php b/actions/emailsettings.php index 0c2033d821..96ada2c826 100644 --- a/actions/emailsettings.php +++ b/actions/emailsettings.php @@ -340,6 +340,7 @@ class EmailsettingsAction extends SettingsAction if ($result === false) { common_log_db_error($user, 'UPDATE', __FILE__); + $user->query('ROLLBACK'); // TRANS: Server error thrown on database error updating e-mail preferences. $this->serverError(_('Could not update user.')); } From df2cc09362404237af52f8b992ed48bd7e926de0 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 17:46:37 +0100 Subject: [PATCH 047/159] $this->scoped->getUser() instead of common_current_user(); --- actions/emailsettings.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/actions/emailsettings.php b/actions/emailsettings.php index 96ada2c826..47c6fe54e5 100644 --- a/actions/emailsettings.php +++ b/actions/emailsettings.php @@ -313,7 +313,7 @@ class EmailsettingsAction extends SettingsAction */ function savePreferences() { - $user = common_current_user(); + $user = $this->scoped->getUser(); if (Event::handle('StartEmailSaveForm', array($this, $this->scoped))) { $emailnotifysub = $this->boolean('emailnotifysub'); @@ -323,8 +323,6 @@ class EmailsettingsAction extends SettingsAction $emailmicroid = $this->boolean('emailmicroid'); $emailpost = $this->boolean('emailpost'); - assert(!is_null($user)); // should already be checked - $user->query('BEGIN'); $original = clone($user); From 27480d8e8e82f1f87362acd53f60bf24c2227b01 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 18:34:48 +0100 Subject: [PATCH 048/159] File_redirection also got urlhash column --- classes/File.php | 10 ++++++++++ classes/File_redirection.php | 33 ++++++++++++++++++++++++--------- scripts/upgrade.php | 17 ++++++++++------- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/classes/File.php b/classes/File.php index dad54166b1..7d09b74c43 100644 --- a/classes/File.php +++ b/classes/File.php @@ -479,6 +479,16 @@ class File extends Managed_DataObject return $this->url; } + static public function getByUrl($url) + { + $file = new File(); + $file->urlhash = self::hashurl($url); + if (!$file->find(true)) { + throw new NoResultException($file); + } + return $file; + } + public function updateUrl($url) { $file = File::getKV('urlhash', self::hashurl($url)); diff --git a/classes/File_redirection.php b/classes/File_redirection.php index 0bcccc6cff..d341839cf2 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -29,7 +29,8 @@ class File_redirection extends Managed_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'file_redirection'; // table name - public $url; // varchar(255) primary_key not_null + public $urlhash; // varchar(64) primary_key not_null + public $url; // text public $file_id; // int(4) public $redirections; // int(4) public $httpcode; // int(4) @@ -42,19 +43,30 @@ class File_redirection extends Managed_DataObject { return array( 'fields' => array( - 'url' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'description' => 'short URL (or any other kind of redirect) for file (id)'), + 'urlhash' => array('type' => 'varchar', 'length' => 64, 'description' => 'sha256 hash of the URL'), + 'url' => array('type' => 'text', 'description' => 'short URL (or any other kind of redirect) for file (id)'), 'file_id' => array('type' => 'int', 'description' => 'short URL for what URL/file'), 'redirections' => array('type' => 'int', 'description' => 'redirect count'), 'httpcode' => array('type' => 'int', 'description' => 'HTTP status code (20x, 30x, etc.)'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), - 'primary key' => array('url'), + 'primary key' => array('urlhash'), 'foreign keys' => array( 'file_redirection_file_id_fkey' => array('file' => array('file_id' => 'id')), ), ); } + static public function getByUrl($url) + { + $file = new File_redirection(); + $file->urlhash = File::hashurl($url); + if (!$file->find(true)) { + throw new NoResultException($file); + } + return $file; + } + static function _commonHttp($url, $redirs) { $request = new HTTPClient($url); $request->setConfig(array( @@ -161,17 +173,18 @@ class File_redirection extends Managed_DataObject */ public function where($in_url, $discover=true) { // let's see if we know this... - $a = File::getKV('url', $in_url); - - if (!empty($a)) { + try { + $a = File::getByUrl($in_url); // this is a direct link to $a->url return $a->url; - } else { - $b = File_redirection::getKV('url', $in_url); - if (!empty($b)) { + } catch (NoResultException $e) { + try { + $b = File_redirection::getByUrl($in_url); // this is a redirect to $b->file_id $a = File::getKV('id', $b->file_id); return $a->url; + } catch (NoResultException $e) { + // Oh well, let's keep going } } @@ -274,6 +287,7 @@ class File_redirection extends Managed_DataObject $file_redir = File_redirection::getKV('url', $short_url); if (!$file_redir instanceof File_redirection) { $file_redir = new File_redirection; + $file_redir->urlhash = File::hashurl($short_url); $file_redir->url = $short_url; $file_redir->file_id = $file_id; $file_redir->insert(); @@ -334,6 +348,7 @@ class File_redirection extends Managed_DataObject function saveNew($data, $file_id, $url) { $file_redir = new File_redirection; + $file_redir->urlhash = File::hashurl($short_url); $file_redir->url = $url; $file_redir->file_id = $file_id; $file_redir->redirections = intval($data['redirects']); diff --git a/scripts/upgrade.php b/scripts/upgrade.php index eeddf5559f..07207357e5 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -88,12 +88,13 @@ function preAlterFixes($schemaUpdater, $table) { switch ($table) { case 'file': + case 'file_redirection': $schemadef = $schemaUpdater->schema->getTableDef($table); if (isset($schemadef['fields']['urlhash'])) { // We already have the urlhash field, so no need to migrate it. break; } - printfnq("\nFound old $table table, upgrading it to contain 'urlhash' field...\n"); + echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; // We have to create a urlhash that is _not_ the primary key, // transfer data and THEN run checkSchema $schemadef['fields']['urlhash'] = array ( @@ -102,18 +103,20 @@ function preAlterFixes($schemaUpdater, $table) 'description' => 'sha256 of destination URL after following redirections', ); $schemaUpdater->schema->ensureTable($table, $schemadef); - printfnq("DONE.\n"); + echo "DONE.\n"; - $filefix = new File(); + $classname = ucfirst($table); + $tablefix = new $classname; // urlhash is hash('sha256', $url) in the File table - printfnq("Updating urlhash fields in $table table...\n"); - $filefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', + echo "Updating urlhash fields in $table table...\n"; + // Maybe very MySQL specific :( + $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', $schemaUpdater->schema->quoteIdentifier($table), 'urlhash', // The line below is "result of sha256 on column `url`" 'SHA2(url, 256)')); - printfnq("DONE.\n"); - printfnq("Resuming core schema upgrade..."); + echo "DONE.\n"; + echo "Resuming core schema upgrade..."; break; } } From 0dfe39ac8757c81eb9bf2c6dae7ca409038aa843 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 18:59:13 +0100 Subject: [PATCH 049/159] File_thumbnail url is not an index --- classes/File_thumbnail.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/File_thumbnail.php b/classes/File_thumbnail.php index 6a92b07d0c..02d42c41ff 100644 --- a/classes/File_thumbnail.php +++ b/classes/File_thumbnail.php @@ -27,7 +27,7 @@ class File_thumbnail extends Managed_DataObject { public $__table = 'file_thumbnail'; // table name public $file_id; // int(4) primary_key not_null - public $url; // varchar(255) unique_key + public $url; // text public $filename; // varchar(255) public $width; // int(4) primary_key public $height; // int(4) primary_key @@ -38,7 +38,7 @@ class File_thumbnail extends Managed_DataObject return array( 'fields' => array( 'file_id' => array('type' => 'int', 'not null' => true, 'description' => 'thumbnail for what URL/file'), - 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of thumbnail'), + 'url' => array('type' => 'text', 'description' => 'URL of thumbnail'), 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if stored locally, filename is put here'), 'width' => array('type' => 'int', 'description' => 'width of thumbnail'), 'height' => array('type' => 'int', 'description' => 'height of thumbnail'), From 45dc76de268f708bc7bf4e8bd1c6b1f2fd5eb033 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 18:59:28 +0100 Subject: [PATCH 050/159] File and File_redirection adhoc storage methods updated for urlhash --- classes/File.php | 36 +++++++++++++++++++ classes/File_redirection.php | 36 +++++++++++++++++++ classes/Managed_DataObject.php | 5 +++ lib/mediafile.php | 4 ++- lib/schemaupdater.php | 9 +++-- plugins/OStatus/classes/Ostatus_profile.php | 4 ++- scripts/upgrade.php | 38 --------------------- 7 files changed, 89 insertions(+), 43 deletions(-) diff --git a/classes/File.php b/classes/File.php index 7d09b74c43..89dcf61cc5 100644 --- a/classes/File.php +++ b/classes/File.php @@ -606,4 +606,40 @@ class File extends Managed_DataObject } return hash(self::URLHASH_ALG, $url); } + + static public function beforeSchemaUpdate() + { + $table = strtolower(get_called_class()); + $schema = Schema::get(); + $schemadef = $schema->getTableDef($table); + + // 2015-02-19 We have to upgrade our table definitions to have the urlhash field populated + if (isset($schemadef['fields']['urlhash']) && in_array('file_urlhash_key', $schemadef['unique keys'])) { + // We already have the urlhash field, so no need to migrate it. + return; + } + echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; + // We have to create a urlhash that is _not_ the primary key, + // transfer data and THEN run checkSchema + $schemadef['fields']['urlhash'] = array ( + 'type' => 'varchar', + 'length' => 64, + 'description' => 'sha256 of destination URL after following redirections', + ); + $schema->ensureTable($table, $schemadef); + echo "DONE.\n"; + + $classname = ucfirst($table); + $tablefix = new $classname; + // urlhash is hash('sha256', $url) in the File table + echo "Updating urlhash fields in $table table...\n"; + // Maybe very MySQL specific :( + $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', + $schema->quoteIdentifier($table), + 'urlhash', + // The line below is "result of sha256 on column `url`" + 'SHA2(url, 256)')); + echo "DONE.\n"; + echo "Resuming core schema upgrade..."; + } } diff --git a/classes/File_redirection.php b/classes/File_redirection.php index d341839cf2..b585ae7884 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -355,4 +355,40 @@ class File_redirection extends Managed_DataObject $file_redir->httpcode = intval($data['code']); $file_redir->insert(); } + + static public function beforeSchemaUpdate() + { + $table = strtolower(get_called_class()); + $schema = Schema::get(); + $schemadef = $schema->getTableDef($table); + + // 2015-02-19 We have to upgrade our table definitions to have the urlhash field populated + if (isset($schemadef['fields']['urlhash']) && in_array('urlhash', $schemadef['primary key'])) { + // We already have the urlhash field, so no need to migrate it. + return; + } + echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; + // We have to create a urlhash that is _not_ the primary key, + // transfer data and THEN run checkSchema + $schemadef['fields']['urlhash'] = array ( + 'type' => 'varchar', + 'length' => 64, + 'description' => 'sha256 of destination URL after following redirections', + ); + $schema->ensureTable($table, $schemadef); + echo "DONE.\n"; + + $classname = ucfirst($table); + $tablefix = new $classname; + // urlhash is hash('sha256', $url) in the File table + echo "Updating urlhash fields in $table table...\n"; + // Maybe very MySQL specific :( + $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', + $schema->quoteIdentifier($table), + 'urlhash', + // The line below is "result of sha256 on column `url`" + 'SHA2(url, 256)')); + echo "DONE.\n"; + echo "Resuming core schema upgrade..."; + } } diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index dc4352270d..b324984b7f 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -396,4 +396,9 @@ abstract class Managed_DataObject extends Memcached_DataObject // @FIXME return true only if something changed (otherwise 0) return $result; } + + static public function beforeSchemaUpdate() + { + // NOOP + } } diff --git a/lib/mediafile.php b/lib/mediafile.php index 3bbbd162f0..f18a557fa4 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -90,11 +90,13 @@ class MediaFile protected function storeFile() { + $fileurl = File::url($this->filename); $file = new File; $file->filename = $this->filename; - $file->url = File::url($this->filename); + $file->urlhash = File::hashurl($fileurl); + $file->url = $fileurl; $filepath = File::path($this->filename); $file->size = filesize($filepath); $file->date = time(); diff --git a/lib/schemaupdater.php b/lib/schemaupdater.php index 1960a06930..ae746c10b5 100644 --- a/lib/schemaupdater.php +++ b/lib/schemaupdater.php @@ -28,9 +28,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } class SchemaUpdater { @@ -46,6 +44,11 @@ class SchemaUpdater */ public function register($tableName, array $tableDef) { + // Check if the table we're registering is related to a Managed_DataObject + if (is_a(ucfirst($tableName), 'Managed_DataObject', true)) { + call_user_func("{$tableName}::beforeSchemaUpdate"); + } + $this->tables[$tableName] = $tableDef; } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 4be4e5112f..6180d05481 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -2087,13 +2087,15 @@ class Ostatus_profile extends Managed_DataObject 'text/html'); $filepath = File::path($filename); + $fileurl = File::url($filename); file_put_contents($filepath, $final); $file = new File; $file->filename = $filename; - $file->url = File::url($filename); + $file->urlhash = File::hashurl($fileurl); + $file->url = $fileurl; $file->size = filesize($filepath); $file->date = time(); $file->mimetype = 'text/html'; diff --git a/scripts/upgrade.php b/scripts/upgrade.php index 07207357e5..c221a495af 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -76,7 +76,6 @@ function updateSchemaCore() $schema = Schema::get(); $schemaUpdater = new SchemaUpdater($schema); foreach (tableDefs() as $table => $def) { - preAlterFixes($schemaUpdater, $table); $schemaUpdater->register($table, $def); } $schemaUpdater->checkSchema(); @@ -84,43 +83,6 @@ function updateSchemaCore() printfnq("DONE.\n"); } -function preAlterFixes($schemaUpdater, $table) -{ - switch ($table) { - case 'file': - case 'file_redirection': - $schemadef = $schemaUpdater->schema->getTableDef($table); - if (isset($schemadef['fields']['urlhash'])) { - // We already have the urlhash field, so no need to migrate it. - break; - } - echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; - // We have to create a urlhash that is _not_ the primary key, - // transfer data and THEN run checkSchema - $schemadef['fields']['urlhash'] = array ( - 'type' => 'varchar', - 'length' => 64, - 'description' => 'sha256 of destination URL after following redirections', - ); - $schemaUpdater->schema->ensureTable($table, $schemadef); - echo "DONE.\n"; - - $classname = ucfirst($table); - $tablefix = new $classname; - // urlhash is hash('sha256', $url) in the File table - echo "Updating urlhash fields in $table table...\n"; - // Maybe very MySQL specific :( - $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', - $schemaUpdater->schema->quoteIdentifier($table), - 'urlhash', - // The line below is "result of sha256 on column `url`" - 'SHA2(url, 256)')); - echo "DONE.\n"; - echo "Resuming core schema upgrade..."; - break; - } -} - function updateSchemaPlugins() { printfnq("Upgrading plugin schema..."); From c05e9b118cce484ab5a0b20b8e7138e6b02e17bf Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 19:07:43 +0100 Subject: [PATCH 051/159] function is hashurl, variable is urlhash --- classes/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index 89dcf61cc5..a10403c49c 100644 --- a/classes/File.php +++ b/classes/File.php @@ -467,7 +467,7 @@ class File extends Managed_DataObject if (!empty($this->filename)) { // A locally stored file, so let's generate a URL for our instance. $url = self::url($this->filename); - if (self::urlhash($url) !== $this->urlhash) { + if (self::hashurl($url) !== $this->urlhash) { // For indexing purposes, in case we do a lookup on the 'url' field. // also we're fixing possible changes from http to https, or paths $this->updateUrl($url); From 5b940f255fd78492ba6dbe0dd4dd71266428f08b Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 19:12:16 +0100 Subject: [PATCH 052/159] Mediafile updated to insert urlhash and lookup properly --- lib/mediafile.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/mediafile.php b/lib/mediafile.php index f18a557fa4..131cc7dd17 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -141,10 +141,11 @@ class MediaFile function maybeAddRedir($file_id, $url) { - $file_redir = File_redirection::getKV('url', $url); - - if (!$file_redir instanceof File_redirection) { + try { + $file_redir = File_redirection::getByUrl($url); + } catch (NoResultException $e) { $file_redir = new File_redirection; + $file_redir->urlhash = File::hashurl($url); $file_redir->url = $url; $file_redir->file_id = $file_id; From 8ac8e2e7344f85b8c2f0f86ee97396eb46315bcf Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 19:29:55 +0100 Subject: [PATCH 053/159] Use new ::getByUrl for File and File_redirection and make use of the exceptions instead endless if statements --- classes/File.php | 79 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/classes/File.php b/classes/File.php index a10403c49c..bc1b4a6d09 100644 --- a/classes/File.php +++ b/classes/File.php @@ -127,51 +127,56 @@ class File extends Managed_DataObject throw new ServerException('No canonical URL from given URL to process'); } - $file = File::getKV('url', $given_url); - if (!$file instanceof File) { + $file = null; + + try { + $file = File::getByUrl($given_url); + } catch (NoResultException $e) { // First check if we have a lookup trace for this URL already - $file_redir = File_redirection::getKV('url', $given_url); - if ($file_redir instanceof File_redirection) { + try { + $file_redir = File_redirection::getByUrl($given_url); $file = File::getKV('id', $file_redir->file_id); if (!$file instanceof File) { // File did not exist, let's clean up the File_redirection entry $file_redir->delete(); } + } catch (NoResultException $e) { + // We just wanted to doublecheck whether a File_thumbnail we might've had + // actually referenced an existing File object. + } + } + + // If we still don't have a File object, let's create one now! + if (!$file instanceof File) { + // @fixme for new URLs this also looks up non-redirect data + // such as target content type, size, etc, which we need + // for File::saveNew(); so we call it even if not following + // new redirects. + $redir_data = File_redirection::where($given_url); + if (is_array($redir_data)) { + $redir_url = $redir_data['url']; + } elseif (is_string($redir_data)) { + $redir_url = $redir_data; + $redir_data = array(); + } else { + // TRANS: Server exception thrown when a URL cannot be processed. + throw new ServerException(sprintf(_("Cannot process URL '%s'"), $given_url)); } - // If we still don't have a File object, let's create one now! - if (!$file instanceof File) { - // @fixme for new URLs this also looks up non-redirect data - // such as target content type, size, etc, which we need - // for File::saveNew(); so we call it even if not following - // new redirects. - $redir_data = File_redirection::where($given_url); - if (is_array($redir_data)) { - $redir_url = $redir_data['url']; - } elseif (is_string($redir_data)) { - $redir_url = $redir_data; - $redir_data = array(); - } else { - // TRANS: Server exception thrown when a URL cannot be processed. - throw new ServerException(sprintf(_("Cannot process URL '%s'"), $given_url)); - } - - // TODO: max field length - if ($redir_url === $given_url || strlen($redir_url) > 255 || !$followRedirects) { - // Save the File object based on our lookup trace - $file = File::saveNew($redir_data, $given_url); - } else { - // This seems kind of messed up... for now skipping this part - // if we're already under a redirect, so we don't go into - // horrible infinite loops if we've been given an unstable - // redirect (where the final destination of the first request - // doesn't match what we get when we ask for it again). - // - // Seen in the wild with clojure.org, which redirects through - // wikispaces for auth and appends session data in the URL params. - $file = self::processNew($redir_url, $notice_id, /*followRedirects*/false); - File_redirection::saveNew($redir_data, $file->id, $given_url); - } + if ($redir_url === $given_url || !$followRedirects) { + // Save the File object based on our lookup trace + $file = File::saveNew($redir_data, $given_url); + } else { + // This seems kind of messed up... for now skipping this part + // if we're already under a redirect, so we don't go into + // horrible infinite loops if we've been given an unstable + // redirect (where the final destination of the first request + // doesn't match what we get when we ask for it again). + // + // Seen in the wild with clojure.org, which redirects through + // wikispaces for auth and appends session data in the URL params. + $file = self::processNew($redir_url, $notice_id, /*followRedirects*/false); + File_redirection::saveNew($redir_data, $file->id, $given_url); } if (!$file instanceof File) { From e299583eee9a354df2df8498fe5803ef4c444b1f Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 19:36:59 +0100 Subject: [PATCH 054/159] Bad check on existing urlhash key --- classes/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index bc1b4a6d09..44bbbc5993 100644 --- a/classes/File.php +++ b/classes/File.php @@ -619,7 +619,7 @@ class File extends Managed_DataObject $schemadef = $schema->getTableDef($table); // 2015-02-19 We have to upgrade our table definitions to have the urlhash field populated - if (isset($schemadef['fields']['urlhash']) && in_array('file_urlhash_key', $schemadef['unique keys'])) { + if (isset($schemadef['fields']['urlhash']) && isset($schemadef['unique keys']['file_urlhash_key'])) { // We already have the urlhash field, so no need to migrate it. return; } From 5471c65c9a2c4a721fe30a6e384ee4f1d0578477 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 19:40:36 +0100 Subject: [PATCH 055/159] less newlines for the scripts/upgrade.php output --- classes/File.php | 4 ++-- classes/File_redirection.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/File.php b/classes/File.php index 44bbbc5993..716e1cc2c6 100644 --- a/classes/File.php +++ b/classes/File.php @@ -623,7 +623,7 @@ class File extends Managed_DataObject // We already have the urlhash field, so no need to migrate it. return; } - echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; + echo "\nFound old $table table, upgrading it to contain 'urlhash' field..."; // We have to create a urlhash that is _not_ the primary key, // transfer data and THEN run checkSchema $schemadef['fields']['urlhash'] = array ( @@ -637,7 +637,7 @@ class File extends Managed_DataObject $classname = ucfirst($table); $tablefix = new $classname; // urlhash is hash('sha256', $url) in the File table - echo "Updating urlhash fields in $table table...\n"; + echo "Updating urlhash fields in $table table..."; // Maybe very MySQL specific :( $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', $schema->quoteIdentifier($table), diff --git a/classes/File_redirection.php b/classes/File_redirection.php index b585ae7884..9309642553 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -367,7 +367,7 @@ class File_redirection extends Managed_DataObject // We already have the urlhash field, so no need to migrate it. return; } - echo "\nFound old $table table, upgrading it to contain 'urlhash' field...\n"; + echo "\nFound old $table table, upgrading it to contain 'urlhash' field..."; // We have to create a urlhash that is _not_ the primary key, // transfer data and THEN run checkSchema $schemadef['fields']['urlhash'] = array ( @@ -381,7 +381,7 @@ class File_redirection extends Managed_DataObject $classname = ucfirst($table); $tablefix = new $classname; // urlhash is hash('sha256', $url) in the File table - echo "Updating urlhash fields in $table table...\n"; + echo "Updating urlhash fields in $table table..."; // Maybe very MySQL specific :( $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', $schema->quoteIdentifier($table), From d061e1065eb3c3d1bf330ae584e85338470c7f84 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 21:01:43 +0100 Subject: [PATCH 056/159] Some loose table definitions which needed 191 char indexes because we want utf8mb4 so badly! --- plugins/OpenID/OpenIDPlugin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/OpenID/OpenIDPlugin.php b/plugins/OpenID/OpenIDPlugin.php index fab35fe2f4..0d093f2868 100644 --- a/plugins/OpenID/OpenIDPlugin.php +++ b/plugins/OpenID/OpenIDPlugin.php @@ -547,13 +547,13 @@ class OpenIDPlugin extends Plugin array( 'fields' => array( 'server_url' => array('type' => 'blob', 'not null' => true), - 'handle' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'default' => ''), // character set latin1, + 'handle' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'default' => ''), // character set latin1, 'secret' => array('type' => 'blob'), 'issued' => array('type' => 'int'), 'lifetime' => array('type' => 'int'), 'assoc_type' => array('type' => 'varchar', 'length' => 64), ), - 'primary key' => array(array('server_url', 255), 'handle'), + 'primary key' => array(array('server_url', 191), 'handle'), )); $schema->ensureTable('oid_nonces', array( @@ -563,7 +563,7 @@ class OpenIDPlugin extends Plugin 'salt' => array('type' => 'char', 'length' => 40), ), 'unique keys' => array( - 'oid_nonces_server_url_timestamp_salt_key' => array(array('server_url', 255), 'timestamp', 'salt'), + 'oid_nonces_server_url_timestamp_salt_key' => array(array('server_url', 191), 'timestamp', 'salt'), ), )); From b54710950f3cfb01f0867e20e4da9e20448d802d Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 21:21:39 +0100 Subject: [PATCH 057/159] unique keys and indexes must be NOT NULL or MySQL fucks up If this merge throws exception on scripts/upgrade.php and you recently tried a nightly (i.e. during 2015-02-19) then just go back a commit or two and try again. Or delete the duplicate entries. Find the entries like this: SELECT COUNT(*), urlhash FROM file_redirection GROUP BY urlhash HAVING COUNT(*) > 1; then for each urlhash (or come up with a smart SQL query) do: DELETE FROM file_redirection WHERE urlhash='hashfrompreviousquery' LIMIT 1; You'll have to remove duplicates more than once if you have >2 identical urlhash entries. LIMIT -1 might do that for you. I'm not sure. --- classes/File.php | 2 +- classes/File_redirection.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/File.php b/classes/File.php index b4bf9f9a1f..c7239777ea 100644 --- a/classes/File.php +++ b/classes/File.php @@ -45,7 +45,7 @@ class File extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true), - 'urlhash' => array('type' => 'varchar', 'length' => 64, 'description' => 'sha256 of destination URL (url field)'), + 'urlhash' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'sha256 of destination URL (url field)'), 'url' => array('type' => 'text', 'description' => 'destination URL after following redirections'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'size' => array('type' => 'int', 'description' => 'size of resource when available'), diff --git a/classes/File_redirection.php b/classes/File_redirection.php index 9309642553..ade04fbcbc 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -43,7 +43,7 @@ class File_redirection extends Managed_DataObject { return array( 'fields' => array( - 'urlhash' => array('type' => 'varchar', 'length' => 64, 'description' => 'sha256 hash of the URL'), + 'urlhash' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'sha256 hash of the URL'), 'url' => array('type' => 'text', 'description' => 'short URL (or any other kind of redirect) for file (id)'), 'file_id' => array('type' => 'int', 'description' => 'short URL for what URL/file'), 'redirections' => array('type' => 'int', 'description' => 'redirect count'), From 987232a0a67b24c6dab3e82f950dd730c45d975d Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 21:26:55 +0100 Subject: [PATCH 058/159] Remove common_debug call that slipped by --- extlib/DB.php | 1 - 1 file changed, 1 deletion(-) diff --git a/extlib/DB.php b/extlib/DB.php index adc2642876..b9b5c4a79f 100644 --- a/extlib/DB.php +++ b/extlib/DB.php @@ -962,7 +962,6 @@ class DB_Error extends PEAR_Error function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null) { - common_debug(var_export($debuginfo,true)); if (is_int($code)) { $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, $mode, $level, $debuginfo); From 0e6c83e5215f8cf0088ca471d108d6f57ff31174 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 22:06:43 +0100 Subject: [PATCH 059/159] Had to avoid using indexes in the migration phase File and File_redirection still had their indexes in the temporary migration table definition. --- classes/File.php | 10 ++++++++-- classes/File_redirection.php | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/classes/File.php b/classes/File.php index c7239777ea..34cd4cdbc7 100644 --- a/classes/File.php +++ b/classes/File.php @@ -46,7 +46,7 @@ class File extends Managed_DataObject 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true), 'urlhash' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'sha256 of destination URL (url field)'), - 'url' => array('type' => 'text', 'description' => 'destination URL after following redirections'), + 'url' => array('type' => 'text', 'description' => 'destination URL after following possible redirections'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'size' => array('type' => 'int', 'description' => 'size of resource when available'), 'title' => array('type' => 'varchar', 'length' => 191, 'description' => 'title of resource when available'), @@ -629,8 +629,14 @@ class File extends Managed_DataObject $schemadef['fields']['urlhash'] = array ( 'type' => 'varchar', 'length' => 64, - 'description' => 'sha256 of destination URL after following redirections', + 'not null' => true, + 'description' => 'sha256 of destination URL (url field)', ); + $schemadef['fields']['url'] = array ( + 'type' => 'text', + 'description' => 'destination URL after following possible redirections', + ); + unset($schemadef['unique keys']); $schema->ensureTable($table, $schemadef); echo "DONE.\n"; diff --git a/classes/File_redirection.php b/classes/File_redirection.php index ade04fbcbc..8c64c58a80 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -373,8 +373,14 @@ class File_redirection extends Managed_DataObject $schemadef['fields']['urlhash'] = array ( 'type' => 'varchar', 'length' => 64, - 'description' => 'sha256 of destination URL after following redirections', + 'not null' => true, + 'description' => 'sha256 hash of the URL', ); + $schemadef['fields']['url'] = array ( + 'type' => 'text', + 'description' => 'short URL (or any other kind of redirect) for file (id)', + ); + unset($schemadef['primary key']); $schema->ensureTable($table, $schemadef); echo "DONE.\n"; From b639a2585655e3bded2357f175d43b3287561616 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Thu, 19 Feb 2015 22:13:42 +0100 Subject: [PATCH 060/159] Emoji support through utf8mb4 seems to be done! scripts/upgrade.php will take a _long_ time though! But it's worth it. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3d0e101d69..0ef8c6c603 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ So far it includes the following changes: - Many improvements to ease adoption of the Qvitter front-end - Protocol adaptions for improved performance and stability - Backing up a user's account now appears to work as it should +- Emojis ๐Ÿ˜ธ Upgrades from _StatusNet_ 1.1.1 will also experience these improvements: From 96099807e1fd93fc6e6bee1619e3edf19083d226 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 20 Feb 2015 01:00:28 +0100 Subject: [PATCH 061/159] Default install to site profile community --- install.php | 6 +++--- lib/default.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install.php b/install.php index d72cf69b07..2752c96767 100644 --- a/install.php +++ b/install.php @@ -265,10 +265,10 @@ class WebInstaller extends Installer
  • Initial access settings for your site

  • diff --git a/lib/default.php b/lib/default.php index b1c6d5ea33..9c88832b66 100644 --- a/lib/default.php +++ b/lib/default.php @@ -53,7 +53,7 @@ $default = 'broughtbyurl' => null, 'closed' => false, 'inviteonly' => true, - 'private' => true, + 'private' => false, 'ssl' => 'never', 'sslserver' => null, 'dupelimit' => 60, // default for same person saying the same thing From c1e3cfe7a782aa81b4d478901305ecd1ebc905cc Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 20 Feb 2015 14:47:12 +0100 Subject: [PATCH 062/159] ensureFeedURL will return Ostatus_profile early if already stored --- plugins/OStatus/classes/Ostatus_profile.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 325e602653..77b1e9bef5 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1120,6 +1120,11 @@ class Ostatus_profile extends Managed_DataObject */ public static function ensureFeedURL($feed_url, array $hints=array()) { + $oprofile = Ostatus_profile::getKV('feeduri', $feed_url); + if ($oprofile instanceof Ostatus_profile) { + return $oprofile; + } + $discover = new FeedDiscovery(); $feeduri = $discover->discoverFromFeedURL($feed_url); From 27bc654b5b763d24919154fa890df170245cfdcd Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 21 Feb 2015 16:43:21 +0100 Subject: [PATCH 063/159] RSSCloud URL field too long for utf8mb4 Should be the last one. If any URLs are longer than 191 chars, it might require more manual interaction. Any instance with problems running scripts/upgrade.php will get special treatment, help and a lollipop. --- plugins/RSSCloud/RSSCloudPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/RSSCloud/RSSCloudPlugin.php b/plugins/RSSCloud/RSSCloudPlugin.php index 823094f269..55f73783fa 100644 --- a/plugins/RSSCloud/RSSCloudPlugin.php +++ b/plugins/RSSCloud/RSSCloudPlugin.php @@ -175,7 +175,7 @@ class RSSCloudPlugin extends Plugin array( 'fields' => array( 'subscribed' => array('type' => 'int', 'not null' => true), - 'url' => array('type' => 'varchar', 'length' => '255', 'not null' => true), + 'url' => array('type' => 'varchar', 'length' => '191', 'not null' => true), 'failures' => array('type' => 'int', 'not null' => true, 'default' => 0), 'created' => array('type' => 'datetime', 'not null' => true), 'modified' => array('type' => 'timestamp', 'not null' => true), From 0d577584c357c5075d34fb00833ef44f2ce03649 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 24 Feb 2015 19:29:28 +0100 Subject: [PATCH 064/159] Script to delete file table entries which have disappeared locally --- scripts/clean_file_table.php | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 scripts/clean_file_table.php diff --git a/scripts/clean_file_table.php b/scripts/clean_file_table.php new file mode 100755 index 0000000000..573abf1ed0 --- /dev/null +++ b/scripts/clean_file_table.php @@ -0,0 +1,62 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'y'; +$longoptions = array('yes'); + +$helptext = <<whereAdd('filename IS NOT NULL'); // local files +$file->whereAdd('filehash IS NULL', 'AND'); // without filehash value +if ($file->find()) { + while ($file->fetch()) { + try { + $file->getPath(); + print '.'; + } catch (FileNotFoundException $e) { + $file->delete(); + print 'x'; + } + } +} +print "\nDONE.\n"; From 325e784ccd555e03b84dbc62abaca3ab405c3a13 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 24 Feb 2015 21:11:25 +0100 Subject: [PATCH 065/159] Don't store duplicates of files. If a new file is uploaded, it will be matched with a previously uploaded file so we don't have to store duplicates. SHA256 is random enough and also unlikely enough to cause collisions. --- classes/File.php | 43 +++++++++++--- classes/File_thumbnail.php | 6 +- lib/default.php | 1 + lib/mediafile.php | 116 ++++++++++++++++++++++++++++--------- scripts/upgrade.php | 31 +++++++++- 5 files changed, 160 insertions(+), 37 deletions(-) diff --git a/classes/File.php b/classes/File.php index 34cd4cdbc7..8fd040b7e9 100644 --- a/classes/File.php +++ b/classes/File.php @@ -28,6 +28,7 @@ class File extends Managed_DataObject public $id; // int(4) primary_key not_null public $urlhash; // varchar(64) unique_key public $url; // text + public $filehash; // varchar(64) indexed public $mimetype; // varchar(50) public $size; // int(4) public $title; // varchar(191) not 255 because utf8mb4 takes more space @@ -39,6 +40,7 @@ class File extends Managed_DataObject public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP const URLHASH_ALG = 'sha256'; + const FILEHASH_ALG = 'sha256'; public static function schemaDef() { @@ -47,6 +49,7 @@ class File extends Managed_DataObject 'id' => array('type' => 'serial', 'not null' => true), 'urlhash' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'sha256 of destination URL (url field)'), 'url' => array('type' => 'text', 'description' => 'destination URL after following possible redirections'), + 'filehash' => array('type' => 'varchar', 'length' => 64, 'not null' => false, 'description' => 'sha256 of the file contents, only for locally stored files of course'), 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), 'size' => array('type' => 'int', 'description' => 'size of resource when available'), 'title' => array('type' => 'varchar', 'length' => 191, 'description' => 'title of resource when available'), @@ -62,6 +65,9 @@ class File extends Managed_DataObject 'unique keys' => array( 'file_urlhash_key' => array('urlhash'), ), + 'indexes' => array( + 'file_filehash_idx' => array('filehash'), + ), ); } @@ -247,12 +253,7 @@ class File extends Managed_DataObject static function filename(Profile $profile, $origname, $mimetype) { - try { - $ext = common_supported_mime_to_ext($mimetype); - } catch (Exception $e) { - // We don't support this mimetype, but let's guess the extension - $ext = substr(strrchr($mimetype, '/'), 1); - } + $ext = self::guessMimeExtension($mimetype); // Normalize and make the original filename more URL friendly. $origname = basename($origname, ".$ext"); @@ -273,6 +274,17 @@ class File extends Managed_DataObject return $filename; } + static function guessMimeExtension($mimetype) + { + try { + $ext = common_supported_mime_to_ext($mimetype); + } catch (Exception $e) { + // We don't support this mimetype, but let's guess the extension + $ext = substr(strrchr($mimetype, '/'), 1); + } + return strtolower($ext); + } + /** * Validation for as-saved base filenames */ @@ -464,7 +476,11 @@ class File extends Managed_DataObject public function getPath() { - return self::path($this->filename); + $filepath = self::path($this->filename); + if (!file_exists($filepath)) { + throw new FileNotFoundException($filepath); + } + return $filepath; } public function getUrl() @@ -494,6 +510,19 @@ class File extends Managed_DataObject return $file; } + /** + * @param string $hashstr String of (preferrably lower case) hexadecimal characters, same as result of 'hash_file(...)' + */ + static public function getByHash($hashstr, $alg=File::FILEHASH_ALG) + { + $file = new File(); + $file->filehash = strtolower($hashstr); + if (!$file->find(true)) { + throw new NoResultException($file); + } + return $file; + } + public function updateUrl($url) { $file = File::getKV('urlhash', self::hashurl($url)); diff --git a/classes/File_thumbnail.php b/classes/File_thumbnail.php index 609f1c34b8..acd488baba 100644 --- a/classes/File_thumbnail.php +++ b/classes/File_thumbnail.php @@ -119,7 +119,11 @@ class File_thumbnail extends Managed_DataObject public function getPath() { - return self::path($this->filename); + $filepath = self::path($this->filename); + if (!file_exists($filepath)) { + throw new FileNotFoundException($filepath); + } + return $filepath; } public function getUrl() diff --git a/lib/default.php b/lib/default.php index 9c88832b66..0e6ad7b9fd 100644 --- a/lib/default.php +++ b/lib/default.php @@ -253,6 +253,7 @@ $default = 'user_quota' => 50000000, 'monthly_quota' => 15000000, 'uploads' => true, + 'filename_base' => 'hash', // for new files, choose one: 'upload', 'hash' 'show_html' => false, // show (filtered) text/html attachments (and oEmbed HTML etc.). Doesn't affect AJAX calls. 'show_thumbs' => true, // show thumbnails in notice lists for uploaded images, and photos and videos linked remotely that provide oEmbed info 'process_links' => true, // check linked resources for embeddable photos and videos; this will hit referenced external web sites when processing new messages. diff --git a/lib/mediafile.php b/lib/mediafile.php index 131cc7dd17..bcc8662f56 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -42,12 +42,13 @@ class MediaFile var $short_fileurl = null; var $mimetype = null; - function __construct(Profile $scoped, $filename = null, $mimetype = null) + function __construct(Profile $scoped, $filename = null, $mimetype = null, $filehash = null) { $this->scoped = $scoped; $this->filename = $filename; $this->mimetype = $mimetype; + $this->filehash = $filehash; $this->fileRecord = $this->storeFile(); $this->fileurl = common_local_url('attachment', @@ -90,6 +91,24 @@ class MediaFile protected function storeFile() { + $filepath = File::path($this->filename); + if (!empty($this->filename) && $this->filehash === null) { + // Calculate if we have an older upload method somewhere (Qvitter) that + // doesn't do this before calling new MediaFile on its local files... + $this->filehash = hash_file(File::FILEHASH_ALG, $filepath); + if ($this->filehash === false) { + throw new ServerException('Could not read file for hashing'); + } + } + + try { + $file = File::getByHash($this->filehash); + // We're done here. Yes. Already. We assume sha256 won't collide on us anytime soon. + return $file; + } catch (NoResultException $e) { + // Well, let's just continue below. + } + $fileurl = File::url($this->filename); $file = new File; @@ -97,11 +116,15 @@ class MediaFile $file->filename = $this->filename; $file->urlhash = File::hashurl($fileurl); $file->url = $fileurl; - $filepath = File::path($this->filename); + $file->filehash = $this->filehash; $file->size = filesize($filepath); + if ($file->size === false) { + throw new ServerException('Could not read file to get its size'); + } $file->date = time(); $file->mimetype = $this->mimetype; + $file_id = $file->insert(); if ($file_id===false) { @@ -206,49 +229,86 @@ class MediaFile throw new ClientException(_('System error uploading file.')); } - // Throws exception if additional size does not respect quota - File::respectsQuota($scoped, $_FILES[$param]['size']); + // TODO: Make documentation clearer that this won't work for files >2GiB because + // PHP is stupid in its 32bit head. But noone accepts 2GiB files with PHP + // anyway... I hope. + $filehash = hash_file(File::FILEHASH_ALG, $_FILES[$param]['tmp_name']); - $mimetype = self::getUploadedMimeType($_FILES[$param]['tmp_name'], - $_FILES[$param]['name']); + try { + $file = File::getByHash($filehash); + // If no exception is thrown the file exists locally, so we'll use that and just add redirections. + $filename = $file->filename; + $mimetype = $file->mimetype; - $basename = basename($_FILES[$param]['name']); - $filename = File::filename($scoped, $basename, $mimetype); - $filepath = File::path($filename); + } catch (NoResultException $e) { + // We have to save the upload as a new local file. This is the normal course of action. - $result = move_uploaded_file($_FILES[$param]['tmp_name'], $filepath); + // Throws exception if additional size does not respect quota + // This test is only needed, of course, if we're uploading something new. + File::respectsQuota($scoped, $_FILES[$param]['size']); - if (!$result) { - // TRANS: Client exception thrown when a file upload operation fails because the file could - // TRANS: not be moved from the temporary folder to the permanent file location. - throw new ClientException(_('File could not be moved to destination directory.')); + $mimetype = self::getUploadedMimeType($_FILES[$param]['tmp_name'], $_FILES[$param]['name']); + + switch (common_config('attachments', 'filename_base')) { + case 'upload': + $basename = basename($_FILES[$param]['name']); + $filename = File::filename($scoped, $basename, $mimetype); + break; + case 'hash': + default: + $filename = strtolower($filehash) . '.' . File::guessMimeExtension($mimetype); + } + $filepath = File::path($filename); + + $result = move_uploaded_file($_FILES[$param]['tmp_name'], $filepath); + + if (!$result) { + // TRANS: Client exception thrown when a file upload operation fails because the file could + // TRANS: not be moved from the temporary folder to the permanent file location. + throw new ClientException(_('File could not be moved to destination directory.')); + } } - return new MediaFile($scoped, $filename, $mimetype); + return new MediaFile($scoped, $filename, $mimetype, $filehash); } static function fromFilehandle($fh, Profile $scoped) { - $stream = stream_get_meta_data($fh); + // So far we're only handling filehandles originating from tmpfile(), + // so we can always do hash_file on $stream['uri'] as far as I can tell! + $filehash = hash_file(File::FILEHASH_ALG, $stream['uri']); - File::respectsQuota($scoped, filesize($stream['uri'])); + try { + $file = File::getByHash($filehash); + // Already have it, so let's reuse the locally stored File + $filename = $file->filename; + $mimetype = $file->mimetype; + } catch (NoResultException $e) { + File::respectsQuota($scoped, filesize($stream['uri'])); - $mimetype = self::getUploadedMimeType($stream['uri']); + $mimetype = self::getUploadedMimeType($stream['uri']); - $filename = File::filename($scoped, "email", $mimetype); + switch (common_config('attachments', 'filename_base')) { + case 'upload': + $filename = File::filename($scoped, "email", $mimetype); + break; + case 'hash': + default: + $filename = strtolower($filehash) . '.' . File::guessMimeExtension($mimetype); + } + $filepath = File::path($filename); - $filepath = File::path($filename); + $result = copy($stream['uri'], $filepath) && chmod($filepath, 0664); - $result = copy($stream['uri'], $filepath) && chmod($filepath, 0664); - - if (!$result) { - // TRANS: Client exception thrown when a file upload operation fails because the file could - // TRANS: not be moved from the temporary folder to the permanent file location. - throw new ClientException(_('File could not be moved to destination directory.' . - $stream['uri'] . ' ' . $filepath)); + if (!$result) { + // TRANS: Client exception thrown when a file upload operation fails because the file could + // TRANS: not be moved from the temporary folder to the permanent file location. + throw new ClientException(_('File could not be moved to destination directory.' . + $stream['uri'] . ' ' . $filepath)); + } } - return new MediaFile($scoped, $filename, $mimetype); + return new MediaFile($scoped, $filename, $mimetype, $filehash); } /** diff --git a/scripts/upgrade.php b/scripts/upgrade.php index c221a495af..692eaac17a 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -48,6 +48,7 @@ function main() fixupFileGeometry(); deleteLocalFileThumbnailsWithoutFilename(); deleteMissingLocalFileThumbnails(); + setFilehashOnLocalFiles(); initGroupProfileId(); initLocalGroup(); @@ -490,7 +491,9 @@ function deleteMissingLocalFileThumbnails() // Checking if there were any File_thumbnail entries without filename if ($thumbs->find()) { while ($thumbs->fetch()) { - if (!file_exists(File_thumbnail::path($thumbs->filename))) { + try { + $thumbs->getPath(); + } catch (FileNotFoundException $e) { $thumbs->delete(); } } @@ -499,4 +502,30 @@ function deleteMissingLocalFileThumbnails() printfnq("DONE.\n"); } +/* + * Files are now stored with their hash, so let's generate for previously uploaded files. + */ +function setFilehashOnLocalFiles() +{ + printfnq('Ensuring all local files have the filehash field set...'); + + $file = new File(); + $file->whereAdd('filename IS NOT NULL'); // local files + $file->whereAdd('filehash IS NULL', 'AND'); // without filehash value + + if ($file->find()) { + while ($file->fetch()) { + try { + $orig = clone($file); + $file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath()); + $file->update($orig); + } catch (FileNotFoundException $e) { + echo "\n WARNING: file ID {$file->id} does not exist on path '{$e->path}'. Clean up the file table?"; + } + } + } + + printfnq("DONE.\n"); +} + main(); From b9d4a9c9f93c812705b5f60691057b57fd0db45b Mon Sep 17 00:00:00 2001 From: buttle Date: Tue, 24 Feb 2015 21:51:31 +0100 Subject: [PATCH 066/159] added DocNav EVENT Event to overide DocNav two small css changes to indent notice footer correctly. --- EVENTS.txt | 6 ++++++ actions/doc.php | 12 ++++++++---- theme/base/css/display.css | 4 ++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index 4f4121ac38..088ce8c024 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1481,3 +1481,9 @@ EndSubMenu: After outputting a submenu (including enclosing tags) to HTML - $out: HTMLOutputter used to output (usually an Action, but not always!) - $menu: The Menu object outputted as a submenu. - $label: Localized text which represents the menu item. + +StartDocNav: Before outputting the docs Nav +- $nav: The DoclNav widget + +EndDocNav: After outputting the docs Nav +- $nav: The DoclNav widget diff --git a/actions/doc.php b/actions/doc.php index 6db3830ce1..85d35d8fcf 100644 --- a/actions/doc.php +++ b/actions/doc.php @@ -174,11 +174,15 @@ class DocNav extends Menu { function show() { - $stub = new HomeStubNav($this->action); - $this->submenu(_m('MENU','Home'), $stub); + if (Event::handle('StartDocNav', array($this))) { + $stub = new HomeStubNav($this->action); + $this->submenu(_m('MENU','Home'), $stub); - $docs = new DocListNav($this->action); - $this->submenu(_m('MENU','Docs'), $docs); + $docs = new DocListNav($this->action); + $this->submenu(_m('MENU','Docs'), $docs); + + Event::handle('EndDocNav', array($this)); + } } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 7d28cee8df..999fce7f83 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1456,6 +1456,10 @@ margin-left:0; margin-left: 56px; } +.threaded-replies .notice > footer, .section .notice > footer { + margin-left:33px; +} + .notice > footer .timestamp span.p-name { display: none; } From 060dbe1b567ef2efd34a514199962033adac7c79 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 24 Feb 2015 22:44:43 +0100 Subject: [PATCH 067/159] Removing whitespace and creating an early-return in inScope --- classes/Notice.php | 239 +++++++++++++++++++-------------------------- 1 file changed, 102 insertions(+), 137 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index 3b03069f13..81a4d8d2e5 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -128,7 +128,7 @@ class Notice extends Managed_DataObject return $def; } - + /* Notice types */ const LOCAL_PUBLIC = 1; const REMOTE = 0; @@ -142,7 +142,7 @@ class Notice extends Managed_DataObject const FOLLOWER_SCOPE = 8; protected $_profile = array(); - + /** * Will always return a profile, if anything fails it will * (through _setProfile) throw a NoProfileException. @@ -157,7 +157,7 @@ class Notice extends Managed_DataObject } return $this->_profile[$this->profile_id]; } - + public function _setProfile(Profile $profile=null) { if (!$profile instanceof Profile) { @@ -268,7 +268,7 @@ class Notice extends Managed_DataObject } return $title; } - + public function getContent() { return $this->content; @@ -674,7 +674,7 @@ class Notice extends Managed_DataObject $notice->insert(); // throws exception on failure // If it's not part of a conversation, it's // the beginning of a new conversation. - if (empty($notice->conversation)) { + if (empty($notice->conversation)) { $orig = clone($notice); // $act->context->conversation will be null if it was not provided $conv = Conversation::create($notice, $options['conversation']); @@ -777,7 +777,7 @@ class Notice extends Managed_DataObject 'distribute' => true); // options will have default values when nothing has been supplied - $options = array_merge($defaults, $options); + $options = array_merge($defaults, $options); foreach (array_keys($defaults) as $key) { // Only convert the keynames we specify ourselves from 'defaults' array into variables $$key = $options[$key]; @@ -957,7 +957,7 @@ class Notice extends Managed_DataObject // Prepare inbox delivery, may be queued to background. $stored->distribute(); } - + return $stored; } @@ -1067,13 +1067,9 @@ class Notice extends Managed_DataObject } $args = func_get_args(); - $format = array_shift($args); - $keyPart = vsprintf($format, $args); - $cacheKey = Cache::key($keyPart); - $c->delete($cacheKey); // delete the "last" stream, too, if this notice is @@ -1187,24 +1183,20 @@ class Notice extends Managed_DataObject } protected $_attachments = array(); - + function attachments() { if (isset($this->_attachments[$this->id])) { return $this->_attachments[$this->id]; } - - $f2ps = File_to_post::listGet('post_id', array($this->id)); - - $ids = array(); - - foreach ($f2ps[$this->id] as $f2p) { - $ids[] = $f2p->file_id; - } - - $files = File::multiGet('id', $ids); + $f2ps = File_to_post::listGet('post_id', array($this->id)); + $ids = array(); + foreach ($f2ps[$this->id] as $f2p) { + $ids[] = $f2p->file_id; + } + + $files = File::multiGet('id', $ids); $this->_attachments[$this->id] = $files->fetchAll(); - return $this->_attachments[$this->id]; } @@ -1286,7 +1278,7 @@ class Notice extends Managed_DataObject $root->free(); return $root; } - + if (is_null($profile)) { $keypart = sprintf('notice:conversation_root:%d:null', $this->id); } else { @@ -1294,7 +1286,7 @@ class Notice extends Managed_DataObject $this->id, $profile->id); } - + $root = self::cacheGet($keypart); if ($root !== false && $root->inScope($profile)) { @@ -1707,9 +1699,9 @@ class Notice extends Managed_DataObject function getReplyProfiles() { $ids = $this->getReplies(); - + $profiles = Profile::multiGet('id', $ids); - + return $profiles->fetchAll(); } @@ -1747,9 +1739,9 @@ class Notice extends Managed_DataObject * * @return array of Group objects */ - + protected $_groups = array(); - + function getGroups() { // Don't save groups for repeats @@ -1757,27 +1749,24 @@ class Notice extends Managed_DataObject if (!empty($this->repeat_of)) { return array(); } - + if (isset($this->_groups[$this->id])) { return $this->_groups[$this->id]; } - + $gis = Group_inbox::listGet('notice_id', array($this->id)); $ids = array(); - foreach ($gis[$this->id] as $gi) - { + foreach ($gis[$this->id] as $gi) { $ids[] = $gi->group_id; } - + $groups = User_group::multiGet('id', $ids); - $this->_groups[$this->id] = $groups->fetchAll(); - return $this->_groups[$this->id]; } - + function _setGroups($groups) { $this->_groups[$this->id] = $groups; @@ -2159,7 +2148,7 @@ class Notice extends Managed_DataObject // Unfortunately this is likely to lose tags or URLs // at the end of long notices. $content = mb_substr($content, 0, $maxlen - 4) . ' ...'; - } + } // Scope is same as this one's @@ -2687,89 +2676,78 @@ class Notice extends Managed_DataObject $scope = self::defaultScope(); } - // If there's no scope, anyone (even anon) is in scope. - - if ($scope == 0) { // Not private - - return !$this->isHiddenSpam($profile); - - } else { // Private, somehow - - // If there's scope, anon cannot be in scope - - if (empty($profile)) { - return false; - } - - // Author is always in scope - - if ($this->profile_id == $profile->id) { - return true; - } - - // Only for users on this site - - if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) { - return false; - } - - // Only for users mentioned in the notice - - if ($scope & Notice::ADDRESSEE_SCOPE) { - - $reply = Reply::pkeyGet(array('notice_id' => $this->id, - 'profile_id' => $profile->id)); - - if (!$reply instanceof Reply) { - return false; - } - } - - // Only for members of the given group - - if ($scope & Notice::GROUP_SCOPE) { - - // XXX: just query for the single membership - - $groups = $this->getGroups(); - - $foundOne = false; - - foreach ($groups as $group) { - if ($profile->isMember($group)) { - $foundOne = true; - break; - } - } - - if (!$foundOne) { - return false; - } - } - - // Only for followers of the author - - $author = null; - - if ($scope & Notice::FOLLOWER_SCOPE) { - - try { - $author = $this->getProfile(); - } catch (Exception $e) { - return false; - } - - if (!Subscription::exists($profile, $author)) { - return false; - } - } - + if ($scope == 0) { // Not scoping, so it is public. return !$this->isHiddenSpam($profile); } + + // If there's scope, anon cannot be in scope + if (empty($profile)) { + return false; + } + + // Author is always in scope + if ($this->profile_id == $profile->id) { + return true; + } + + // Only for users on this site + if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) { + return false; + } + + // Only for users mentioned in the notice + if ($scope & Notice::ADDRESSEE_SCOPE) { + + $reply = Reply::pkeyGet(array('notice_id' => $this->id, + 'profile_id' => $profile->id)); + + if (!$reply instanceof Reply) { + return false; + } + } + + // Only for members of the given group + if ($scope & Notice::GROUP_SCOPE) { + + // XXX: just query for the single membership + + $groups = $this->getGroups(); + + $foundOne = false; + + foreach ($groups as $group) { + if ($profile->isMember($group)) { + $foundOne = true; + break; + } + } + + if (!$foundOne) { + return false; + } + } + + // Only for followers of the author + $author = null; + + if ($scope & Notice::FOLLOWER_SCOPE) { + + try { + $author = $this->getProfile(); + } catch (Exception $e) { + return false; + } + + if (!Subscription::exists($profile, $author)) { + return false; + } + } + + return !$this->isHiddenSpam($profile); } function isHiddenSpam($profile) { - + // Hide posts by silenced users from everyone but moderators. if (common_config('notice', 'hidespam')) { @@ -2819,7 +2797,7 @@ class Notice extends Managed_DataObject $skip = array('_profile', '_groups', '_attachments', '_faves', '_replies', '_repeats'); return array_diff($vars, $skip); } - + static function defaultScope() { $scope = common_config('notice', 'defaultscope'); @@ -2836,7 +2814,6 @@ class Notice extends Managed_DataObject static function fillProfiles($notices) { $map = self::getProfiles($notices); - foreach ($notices as $entry=>$notice) { try { if (array_key_exists($notice->profile_id, $map)) { @@ -2847,42 +2824,35 @@ class Notice extends Managed_DataObject unset($notices[$entry]); } } - + return array_values($map); } - + static function getProfiles(&$notices) { $ids = array(); foreach ($notices as $notice) { $ids[] = $notice->profile_id; } - $ids = array_unique($ids); - - return Profile::pivotGet('id', $ids); + return Profile::pivotGet('id', $ids); } - + static function fillGroups(&$notices) { $ids = self::_idsOf($notices); - $gis = Group_inbox::listGet('notice_id', $ids); - $gids = array(); - foreach ($gis as $id => $gi) - { + foreach ($gis as $id => $gi) { foreach ($gi as $g) { $gids[] = $g->group_id; } } - + $gids = array_unique($gids); - $group = User_group::pivotGet('id', $gids); - foreach ($notices as $notice) { $grps = array(); @@ -2906,21 +2876,16 @@ class Notice extends Managed_DataObject static function fillAttachments(&$notices) { $ids = self::_idsOf($notices); - $f2pMap = File_to_post::listGet('post_id', $ids); - $fileIds = array(); - foreach ($f2pMap as $noticeId => $f2ps) { foreach ($f2ps as $f2p) { - $fileIds[] = $f2p->file_id; + $fileIds[] = $f2p->file_id; } } $fileIds = array_unique($fileIds); - $fileMap = File::pivotGet('id', $fileIds); - foreach ($notices as $notice) { $files = array(); From ce91f1c0e6a001c1e43ee52dfd26789ac4f83d45 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Tue, 24 Feb 2015 22:59:58 +0100 Subject: [PATCH 068/159] Hide posts from users with private_stream in scoping streams For example the public timeline would show notices from a user with private_stream configured. (previously it would only hide _new_ notices by this user as they would be the only ones with notice scoping set). --- classes/Notice.php | 15 +++------------ classes/Profile.php | 9 +++++++++ classes/User.php | 5 +++++ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index 81a4d8d2e5..c631c1fcc6 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -2676,7 +2676,7 @@ class Notice extends Managed_DataObject $scope = self::defaultScope(); } - if ($scope == 0) { // Not scoping, so it is public. + if ($scope == 0 && !$this->getProfile()->isPrivateStream()) { // Not scoping, so it is public. return !$this->isHiddenSpam($profile); } @@ -2727,18 +2727,9 @@ class Notice extends Managed_DataObject } } - // Only for followers of the author - $author = null; + if ($scope & Notice::FOLLOWER_SCOPE || $this->getProfile()->isPrivateStream()) { - if ($scope & Notice::FOLLOWER_SCOPE) { - - try { - $author = $this->getProfile(); - } catch (Exception $e) { - return false; - } - - if (!Subscription::exists($profile, $author)) { + if (!Subscription::exists($profile, $this->getProfile())) { return false; } } diff --git a/classes/Profile.php b/classes/Profile.php index 3c3b3475b9..a944d5b4d2 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1572,6 +1572,15 @@ class Profile extends Managed_DataObject return $this->getUser()->shortenLinks($text, $always); } + public function isPrivateStream() + { + // We only know of public remote users as of yet... + if (!$this->isLocal()) { + return false; + } + return $this->getUser()->private_stream ? true : false; + } + public function delPref($namespace, $topic) { return Profile_prefs::setData($this, $namespace, $topic, null); } diff --git a/classes/User.php b/classes/User.php index c7c91c8ec6..764574d225 100644 --- a/classes/User.php +++ b/classes/User.php @@ -992,6 +992,11 @@ class User extends Managed_DataObject return $act; } + public function isPrivateStream() + { + return $this->getProfile()->isPrivateStream(); + } + public function delPref($namespace, $topic) { return $this->getProfile()->delPref($namespace, $topic); From 0854a84eb9f318944ce69c0c5cd6655a29fade4b Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:14:27 +0100 Subject: [PATCH 069/159] Throw more explicit exception in ImageFile --- lib/imagefile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/imagefile.php b/lib/imagefile.php index 2dc260b1bf..fa57d524e5 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -141,7 +141,7 @@ class ImageFile public function getPath() { if (!file_exists($this->filepath)) { - throw new ServerException('No file in ImageFile filepath'); + throw new FileNotFoundException($this->filepath); } return $this->filepath; From 4b8301d39e032536a7d61e92a0ea0f5b1c30af1a Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:31:44 +0100 Subject: [PATCH 070/159] ImageFile constructor changed to align with existing code Noone passed type, width or height to new ImageFile(...) and in all instances, both parameters were set (though $id is null on occasion). --- lib/imagefile.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/imagefile.php b/lib/imagefile.php index fa57d524e5..f123d47485 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -54,7 +54,7 @@ class ImageFile var $rotate=0; // degrees to rotate for properly oriented image (extrapolated from EXIF etc.) var $animated = null; // Animated image? (has more than 1 frame). null means untested - function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null) + function __construct($id, $filepath) { $this->id = $id; $this->filepath = $filepath; @@ -74,9 +74,9 @@ class ImageFile throw new UnsupportedMediaException(_('Unsupported image format.'), $this->filepath); } - $this->type = ($info) ? $info[2]:$type; - $this->width = ($info) ? $info[0]:$width; - $this->height = ($info) ? $info[1]:$height; + $this->width = $info[0]; + $this->height = $info[1]; + $this->type = $info[2]; if ($this->type == IMAGETYPE_JPEG && function_exists('exif_read_data')) { // Orientation value to rotate thumbnails properly From 220a13b87f061ffc7771dd80c9d442b528cbc5ec Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:33:32 +0100 Subject: [PATCH 071/159] mimetype added to ImageFile --- lib/imagefile.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/imagefile.php b/lib/imagefile.php index f123d47485..4ea1803f39 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -53,6 +53,7 @@ class ImageFile var $width; var $rotate=0; // degrees to rotate for properly oriented image (extrapolated from EXIF etc.) var $animated = null; // Animated image? (has more than 1 frame). null means untested + var $mimetype = null; // The _ImageFile_ mimetype, _not_ the originating File object function __construct($id, $filepath) { @@ -77,6 +78,7 @@ class ImageFile $this->width = $info[0]; $this->height = $info[1]; $this->type = $info[2]; + $this->mimetype = $info['mime']; if ($this->type == IMAGETYPE_JPEG && function_exists('exif_read_data')) { // Orientation value to rotate thumbnails properly From 9a843548c0c95cac3c9d6e8674c26d11fca027ed Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:34:00 +0100 Subject: [PATCH 072/159] Save thumbnails with proper extension This might cause double extensions, but that's ok since the filename is stored in the database. We might want to look at it later though. --- classes/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index 8fd040b7e9..242d109804 100644 --- a/classes/File.php +++ b/classes/File.php @@ -442,7 +442,7 @@ class File extends Managed_DataObject } // throws exception on failure to generate thumbnail - $outname = "thumb-{$width}x{$height}-" . $image->filename; + $outname = "thumb-{$width}x{$height}-{$image->filename}." . File::guessMimeExtension($image->mimetype); $outpath = self::path($outname); // The boundary box for our resizing From 3bbb748a0884f4b9ecf090562843d3194a7b82af Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:36:14 +0100 Subject: [PATCH 073/159] VideoThumbnails changed to use 'exec' call to avconv --- .../VideoThumbnails/VideoThumbnailsPlugin.php | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php index 254931e5fb..758164923d 100644 --- a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php +++ b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php @@ -2,7 +2,7 @@ /** * GNU social - a federating social network * - * Plugin to make thumbnails of video files with ffmpeg + * Plugin to make thumbnails of video files with avconv * * PHP version 5 * @@ -31,10 +31,13 @@ if (!defined('GNUSOCIAL')) { exit(1); } /* * Dependencies: - * php5-ffmpeg + * avconv (external program call) * php5-gd * - * Video support will depend on your ffmpeg. + * Todo: + * Make sure we support ffmpeg too, so we're not super Debian oriented. + * + * Video support will depend on your avconv. */ class VideoThumbnailsPlugin extends Plugin @@ -52,23 +55,13 @@ class VideoThumbnailsPlugin extends Plugin return true; } - $movie = new ffmpeg_movie($file->getPath(), false); - - $frames = $movie->getFrameCount(); - if ($frames > 0) { - $frame = $movie->getFrame(floor($frames/2)); - } else { - $frame = $movie->getNextKeyFrame(); - } - - // We failed to get a frame. - if (!$frame instanceof ffmpeg_frame) { - return true; - } - // Let's save our frame to a temporary file. If we fail, remove it. - $imgPath = tempnam(sys_get_temp_dir(), 'socialthumb'); - if (!imagejpeg($frame->toGDImage(), $imgPath)) { + $imgPath = tempnam(sys_get_temp_dir(), 'socialthumb-'); + + $result = exec('avconv -i '.escapeshellarg($file->getPath()).' -vcodec mjpeg -vframes 1 -f mjpeg -an '.escapeshellarg($imgPath)); + + if (!getimagesize($imgPath)) { + common_debug('exec of "avconv" produced a bad/nonexisting image it seems'); @unlink($imgPath); return true; } From 95b61a5e1212b5017d425f19a6a5ce08cd629ffc Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:37:57 +0100 Subject: [PATCH 074/159] Only local files to be passed through VideoThumbnails --- plugins/VideoThumbnails/VideoThumbnailsPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php index 758164923d..3cdf07478e 100644 --- a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php +++ b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php @@ -51,7 +51,7 @@ class VideoThumbnailsPlugin extends Plugin { // The calling function might accidentally pass application/ogg videos. // If that's a problem, let's fix it in the calling function. - if ($media !== 'video') { + if ($media !== 'video' || empty($file->filename)) { return true; } From ce0b22157373b3914fd8211e0850c65ef2280755 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 01:41:34 +0100 Subject: [PATCH 075/159] avconv required -f image2 not -f mjpeg at least on my server --- plugins/VideoThumbnails/VideoThumbnailsPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php index 3cdf07478e..2bbc06d738 100644 --- a/plugins/VideoThumbnails/VideoThumbnailsPlugin.php +++ b/plugins/VideoThumbnails/VideoThumbnailsPlugin.php @@ -58,7 +58,7 @@ class VideoThumbnailsPlugin extends Plugin // Let's save our frame to a temporary file. If we fail, remove it. $imgPath = tempnam(sys_get_temp_dir(), 'socialthumb-'); - $result = exec('avconv -i '.escapeshellarg($file->getPath()).' -vcodec mjpeg -vframes 1 -f mjpeg -an '.escapeshellarg($imgPath)); + $result = exec('avconv -i '.escapeshellarg($file->getPath()).' -vcodec mjpeg -vframes 1 -f image2 -an '.escapeshellarg($imgPath)); if (!getimagesize($imgPath)) { common_debug('exec of "avconv" produced a bad/nonexisting image it seems'); From 38729133e2697832c09fcaa06571795c08777904 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 12:49:15 +0100 Subject: [PATCH 076/159] HTML5 media tags are short tags --- lib/xmloutputter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/xmloutputter.php b/lib/xmloutputter.php index 481b2dedca..71d57e2d56 100644 --- a/lib/xmloutputter.php +++ b/lib/xmloutputter.php @@ -212,7 +212,7 @@ class XMLOutputter { static $empty_tag = array('base', 'meta', 'link', 'hr', 'br', 'param', 'img', 'area', - 'input', 'col'); + 'input', 'col', 'source'); // XXX: check namespace if (in_array($tag, $empty_tag)) { $this->xw->endElement(); From d0ef37a4874701463237b8bcd72eb16c2420c2c3 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 12:50:56 +0100 Subject: [PATCH 077/159] trailing whitespace --- plugins/Autocomplete/js/autocomplete.go.js | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/Autocomplete/js/autocomplete.go.js b/plugins/Autocomplete/js/autocomplete.go.js index 829581ae3e..ed1ea4225d 100644 --- a/plugins/Autocomplete/js/autocomplete.go.js +++ b/plugins/Autocomplete/js/autocomplete.go.js @@ -135,4 +135,3 @@ SN.Init.PeopletagAutocomplete = function(txtBox) { $(document).on('click', '.peopletags_edit_button', function () { SN.Init.PeopletagAutocomplete($(this).closest('dd').find('[name="tags"]')); }); - From 86a8f4c5c7c6801d1f770424fec00c59ff591b90 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 25 Feb 2015 12:56:41 +0100 Subject: [PATCH 078/159] Removed Lato font from themes where it was unnecessary --- theme/neo-gnu/README | 4 - theme/neo-gnu/css/display.css | 25 +- theme/neo-gnu/fonts/lato-bold-webfont.eot | Bin 33202 -> 0 bytes theme/neo-gnu/fonts/lato-bold-webfont.svg | 297 ------------------ theme/neo-gnu/fonts/lato-bold-webfont.ttf | Bin 59412 -> 0 bytes theme/neo-gnu/fonts/lato-bold-webfont.woff | Bin 37248 -> 0 bytes theme/neo-gnu/fonts/lato-italic-webfont.eot | Bin 26336 -> 0 bytes theme/neo-gnu/fonts/lato-italic-webfont.svg | 281 ----------------- theme/neo-gnu/fonts/lato-italic-webfont.ttf | Bin 53652 -> 0 bytes theme/neo-gnu/fonts/lato-italic-webfont.woff | Bin 30844 -> 0 bytes theme/neo-gnu/fonts/lato-regular-webfont.eot | Bin 33864 -> 0 bytes theme/neo-gnu/fonts/lato-regular-webfont.svg | 297 ------------------ theme/neo-gnu/fonts/lato-regular-webfont.ttf | Bin 60848 -> 0 bytes theme/neo-gnu/fonts/lato-regular-webfont.woff | Bin 37908 -> 0 bytes theme/neo-gnu/fonts/stylesheet.css | 26 -- theme/neo-quitter/fonts/Lato-Bold.eot | Bin 273213 -> 0 bytes theme/neo-quitter/fonts/Lato-Bold.ttf | Bin 709504 -> 0 bytes theme/neo-quitter/fonts/Lato-Bold.woff | Bin 328952 -> 0 bytes theme/neo-quitter/fonts/Lato-Italic.eot | Bin 286476 -> 0 bytes theme/neo-quitter/fonts/Lato-Italic.ttf | Bin 719616 -> 0 bytes theme/neo-quitter/fonts/Lato-Italic.woff | Bin 343528 -> 0 bytes theme/neo-quitter/fonts/Lato-Regular.eot | Bin 268273 -> 0 bytes theme/neo-quitter/fonts/Lato-Regular.ttf | Bin 687980 -> 0 bytes theme/neo-quitter/fonts/Lato-Regular.woff | Bin 323172 -> 0 bytes theme/neo-quitter/fonts/stylesheet.css | 26 -- 25 files changed, 2 insertions(+), 954 deletions(-) delete mode 100644 theme/neo-gnu/fonts/lato-bold-webfont.eot delete mode 100644 theme/neo-gnu/fonts/lato-bold-webfont.svg delete mode 100644 theme/neo-gnu/fonts/lato-bold-webfont.ttf delete mode 100644 theme/neo-gnu/fonts/lato-bold-webfont.woff delete mode 100644 theme/neo-gnu/fonts/lato-italic-webfont.eot delete mode 100644 theme/neo-gnu/fonts/lato-italic-webfont.svg delete mode 100644 theme/neo-gnu/fonts/lato-italic-webfont.ttf delete mode 100644 theme/neo-gnu/fonts/lato-italic-webfont.woff delete mode 100644 theme/neo-gnu/fonts/lato-regular-webfont.eot delete mode 100644 theme/neo-gnu/fonts/lato-regular-webfont.svg delete mode 100644 theme/neo-gnu/fonts/lato-regular-webfont.ttf delete mode 100644 theme/neo-gnu/fonts/lato-regular-webfont.woff delete mode 100644 theme/neo-gnu/fonts/stylesheet.css delete mode 100644 theme/neo-quitter/fonts/Lato-Bold.eot delete mode 100644 theme/neo-quitter/fonts/Lato-Bold.ttf delete mode 100644 theme/neo-quitter/fonts/Lato-Bold.woff delete mode 100644 theme/neo-quitter/fonts/Lato-Italic.eot delete mode 100644 theme/neo-quitter/fonts/Lato-Italic.ttf delete mode 100644 theme/neo-quitter/fonts/Lato-Italic.woff delete mode 100644 theme/neo-quitter/fonts/Lato-Regular.eot delete mode 100644 theme/neo-quitter/fonts/Lato-Regular.ttf delete mode 100644 theme/neo-quitter/fonts/Lato-Regular.woff delete mode 100644 theme/neo-quitter/fonts/stylesheet.css diff --git a/theme/neo-gnu/README b/theme/neo-gnu/README index c65027ea6b..8892966de9 100644 --- a/theme/neo-gnu/README +++ b/theme/neo-gnu/README @@ -7,7 +7,3 @@ http://www.openclipart.org/detail/34957 Some icons by Mark James http://www.famfamfam.com/lab/icons/silk/ http://creativecommons.org/licenses/by/2.5/ Creative Commons Attribution 2.5 License - -Lato font by ลukasz Dziedzic (http://www.typoland.com) via Google Web Fonts (http://www.google.com/webfonts) -SIL Open Font License, 1.1 (http://scripts.sil.org/OFL) -Prepared for web with Font Squirrel (http://www.fontsquirrel.com/fontface/generator) diff --git a/theme/neo-gnu/css/display.css b/theme/neo-gnu/css/display.css index 1daedf9282..ea5309b326 100644 --- a/theme/neo-gnu/css/display.css +++ b/theme/neo-gnu/css/display.css @@ -8,27 +8,6 @@ * @link http://gnu.io/ */ -@font-face { - font-family: 'Lato'; - src: url('../fonts/lato-regular-webfont.eot?') format('eot'), url('../fonts/lato-regular-webfont.woff') format('woff'), url('../fonts/lato-regular-webfont.ttf') format('truetype'), url('../fonts/lato-regular-webfont.svg#webfontCjmEHx3G') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/lato-bold-webfont.eot?') format('eot'), url('../fonts/lato-bold-webfont.woff') format('woff'), url('../fonts/lato-bold-webfont.ttf') format('truetype'), url('../fonts/lato-bold-webfont.svg#webfontCjmEHx3G') format('svg'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/lato-italic-webfont.eot?') format('eot'), url('../fonts/lato-italic-webfont.woff') format('woff'), url('../fonts/lato-italic-webfont.ttf') format('truetype'), url('../fonts/lato-italic-webfont.svg#webfontCjmEHx3G') format('svg'); - font-weight: normal; - font-style: italic; -} - @media screen, projection, tv { /* general styles and layout */ @@ -37,12 +16,12 @@ body { /* background-color: #C6C8CC; background-image: url(../images/bg.png); */ background-color: #e9eaed; - font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; color: #222; } input, textarea, select, option { - font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } a {color: #666;} diff --git a/theme/neo-gnu/fonts/lato-bold-webfont.eot b/theme/neo-gnu/fonts/lato-bold-webfont.eot deleted file mode 100644 index 311969480a3af8543f98c3e746ff8df69a69ac1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33202 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 diff --git a/theme/neo-gnu/fonts/lato-bold-webfont.svg b/theme/neo-gnu/fonts/lato-bold-webfont.svg deleted file mode 100644 index 90e8e2551b..0000000000 --- a/theme/neo-gnu/fonts/lato-bold-webfont.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Copyright c 2010 by tyPoland Lukasz Dziedzic with Reserved Font Name Lato Licensed under the SIL Open Font License Version 11 -Designer : Lukasz Dziedzic -Foundry : tyPoland Lukasz Dziedzic -Foundry URL : httpwwwtypolandcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/theme/neo-gnu/fonts/lato-bold-webfont.ttf b/theme/neo-gnu/fonts/lato-bold-webfont.ttf deleted file mode 100644 index c947e75994d8cea7d8deece6fd65a07364f182ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59412 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

    lUJQRcf8 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 Igt_Sd0F`H@o&W#< diff --git a/theme/neo-gnu/fonts/lato-bold-webfont.woff b/theme/neo-gnu/fonts/lato-bold-webfont.woff deleted file mode 100644 index cd9fe13a4819fbaa146e01cd7934f04fde58a606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37248 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 H-C{#Tis>>+_`h# zd6UV>$>*Dsll+;PWX}NrxU&ZUK>t-_z<)g+3J3&3Mgk!L{v`nc|1ov#IsgE!3Ij<0 zC;xBx4@3XQF{lJz|1bDI3?@JwU=8pEc>FKL1*rVzTLatx&H&s0CCUIpfIYw);PW5x z0KENgDINePfcrno4G{ZpWb~iv^Iy#W%=sVH7U1+>y!U_2_Wz~O|8)ERd;oy>|H}pa zzw*fHDQO@6&yoIr1qpDq4AA@l(2N3z)I(;@V#jSajWC>e+DoLmWfAITCoIyAWF&#! z9-fBmFnPdU<#EqavtwJ?@#!DUhwF*fY0aADJ+kja{JQ(ubru(x=UTC&^R$%E^gH;E zG+RD(QpP#HXuj?gny;(&qH8&1fvKI8NA&T3Td@S<4kk{c{Kqs!p|}Yg612};MmkIJ zU#PZ3N^adYztc#BeuVpDX7p}@mKG1nlju=c?t>UaR7r)RM)y*g{VBt#8|K!I;Fsx{{R9E| z+OPj&NrOD&-2MIAsMq&*`IXtN5>rPoriiarGK{0@kA~&_x@x!ZS|~|nU@`&E-_98` znhFQ-0a8nz`rgtj^MNNJ81cRJs~g4!wKTq8xq;=o7hi8oDjZg~YM`~LlDo9n&lLM4 zq5%Af=g?5B?x0rvKZ+O$be}-|vD%|Qkw5}&x~q<>wt?h15jZh1X2`NpCkp4qjXywX zTsz9s*s%A?6Qtuc7U}k>gNC;9x@q;9_(=eyO7$67oU#^Ni9(6_mP+B{89I^fs?7 zSZ~m>4*v{`dLsrAGD>!_NB%gk?0+1q>~P0M&%?xry%nAmH)WjmlrpT`<~S&*n)N^n zp-%P9CiR8E1tY~7$?GJ--Y|9;`(CxNO}#ygwjWCtR3vjZDVe8;-wa6v8P;1i{*)1O zLM{^h{&=GX?8bb-8HWh34WLZzAYWn_LALSb2u0#N6@#K~ANRVZjJkm)@~hT|g!zV{ zrjc%BH#LLZn0rRDJva!X0jtPza_P;;(;>m_f^~P2dSsz#skh-Ca;#VcxKJ3?8DMHy z;4Q1+yq}s#CgbuPr?Lx+%@97F&}4GcXW!UVls^ROOou4^s34_KR8$futRVb7wIMyO zLD^&%FMXc(%GPE}>4k;HQdbb_)n|7%U8$r4IU?gtAW!zy_i2B**x04f3;p2Fvm5q( zsJicfeWvK2&NlG_06VAQM4=ZShOmj&6zGm_Ifk`jH=}i_g(G9_3W1_SWGD2osb_XK zou_nD;Q-JL<7rZAzXq6lme%_s{j$lv(`e&E+|y7x+}D%@J6zdRZjmwBAAfMp{8TgR zAUbralqgv(HqY>sEAc`54M(r!tJp%gW#V18f^^`E3spV6H`CJJLn}tbz_z$FK0~kd zAb6?g_&{>p?CXT22|1_xi8n3`Nx+Se3bI=N&6)=?2GQVtAEtX_g3BS zZA8(EgRy_6O=!aJC!I;2OrDE4KAeSLUT$usw8et^m=uwIx=jUSd4|s_vO>$1Wud$(KK9}3U zfA6>GVD*O^&&>j2PQAO{)DzPR!Bl-Rcm{h#L%pN9wUG}dW*g=y1>>KhvI9BZdSC-( zQNP?dTSE~d$i!Coy>m9oYJqfq6O?ZR7C;mtz+uuKEP!MTs22ve7qZ2mFn;)@kX(}F zpt0njIdouK1jH>llq5Oun|kOHg8k=-I+S}@lbFVcHZCM)`Pkm}VDFuS^*Zj2MA(q< z)oHd`8po!{eDUX8TGVU?)(BQ~Im4~fPXl&`X8wuZH<6fPX_T8v8D~rqU+CN8Y=RJR zIo`~wMhuTXnQONxS3OcNeFuQES%MmOoPQ#g4@tED;`nCO&@9_V_M1n}8$vv7-OOWbJTnUs;Blm9$3l*jCuH1Gqp&PHzl7fJwP3xRXH(6pZ%z( z2wZfWH~u*K9d?`;>Ie4fai>bmInmoHKl`Sn#c$V#7dDed7a*@&y$h;WM*56?KIIQ$ zgRsjraLC6af*@gx7J)z$3gVVdt|5B_TX>ah7saqD9b)ej20(35gb$MoPF2@0K>#;d z0>;24ITlT|RGrOpQyV{Ujgy%{#~Y&=9!9fAUa>&e;n-1wSF-XN=2|U;`Z_)ED?#R1 zV;h#eznU0+ZQB1~%`;n2Vy!O$W$XA029@es*y? zy{8}3C54&4E6>2}%3_vO zN%pxGTYCYKJ1xE1)qjiNa z|3ap_L`mh>h`BwMP--urri~9-*N<&N(&;d=l}r6?s9W^s_QF;MBVn9Xf_cZ*SResb zPyHn_^TgZmz#NMUb@8=mws%Tg*qtk`PvD6|KsivCYH)$CAc$)e-Im10cles`K%);w z5UU8h<5y6vwIIuUNj;WUi0Az$wJ_69Nb%Rpvni5c3$m;BQGV@%cVCNLp*zy)oaWr2 zyY%~kg{=TXGPj7OYJqsO+1q30kwkqA=`US}qKYRh4;#U6ez@!^&+UPcsQ&p1aD2F5 z{1+Vlp!M7iddckY8t<8zkHHL?Ksth#vYu?U|Mcq^sGW<+PvSf@omEJ(>`;^N)6?Kh#BW_jFJEBbAi0-NtjC zzA4d%_(4(sBo?CIwg9nK`r+$FS~y=NSqn@x-(%CQG43M0 zf!xAXUwvkBN0~{dg3WLc2?sQjHctaiqra#wX^n5~AW?EZMU?OCbCl($i~le$+UTd! z^A+&NoCZx!6#9JN6;?d`7pv9g+203#OLX~hxSN+L{pzsJIWmZdZT_G90GMCVURCem zrk~v`z)UqrT~o=s2W{MBJnIL>i20c#EuI#4p2PGcD?zi1abD&UxypRhUH@x%9zO0oHpNrdP4)(H5C6NY-ML5H?vd#j8^|%gm2)VRsR+nb>Sg^ zbP4&)Ac~9$r`C}9be^7v4$L1&goip@QEOY&L9U<4&r^wCk6(ROcG$m!zbiLY{Bm92 z=s6oGDYxczDzb*&ATfv=>OU&UWhYl2Q6s{ZJQ;hi5T40d#wfw1x1b~VJvJ{y_3c-kN&l3uA!o*`@!8Wg zr0(0Fjk8+(8HeTDw@wdLyW4Km2{#0Kt1lF`$sEHboZMqv3R`f7<-|Y@Vp>hJxFo;lckxJqgx!}Ki}&p^X}9} z_wJ{I{+vZw#f2}UK+9vn#_O9n@y{uNJ%8_IjpshaZHpDANIp6H66~5~;>BI94v78@ z$BJEiMc?xZ)R5GKNT$RWSuFCA47ryaRm!3LNbfu2IezC2GZ9ZiRI4}g#+jOTuO8aV zO`H2#ZWsv?Yz}I?o_%us^^P~Y8bpdcefr=cM?|jG=)SZmar4vR+&9ue<%)e#O>d3h z^ttSsjbG+**K#Cfj!6B^ zg*26MkZoO``JoC=CMnTtT5Ct9QnnWsMW`Mgj_#uQU!p9=0Zq5jz|>Djj4uhPl|zZL zlz=qnV+|FRBZj>Vd9A=y0AoV9Mdc@#x~KQSc@MC0=???doe1Zl3B@cd5A##-?^e)m zr$A|;4ZpxIiPLFhO1>kXtLOZEs9`MuJqI{9l(-G9EqlvRI=)kh4C{kgLHRAMgswKL z>6euVIMVBB2G&y2H6+UK8!+{0{Sl2pd+TZXvUj15Hk%|Lzu|W}CmmA5V}4|M{9axR zO{ENI5->xIj6@ut4N*av<>nrC$@r5`7i=T zauCZ&$%#p)8Ena-J)ql+QTwsi4bRt!w55o|Hm8;p*gsFzijLTe8v#u%%Mv8%qxNHQZK*U&JhQ)#*LHx+s2 zkFS(%4u*y#8*L?($Lx*F+@A!r-Q)JU%)_~iv0-J@SWDuwMXmPpbxI=Zv5Zxqq-I&n z;i!9Z)?inRnO!7P#{A}`Il7;iH3dYJ9vN3w@1(9xXTQwfczSSJqK#|f7t)6yf*7XQqjS)Hs<4Ush?kkqxUlS75~TMT;uj*|23awy%;S8p8fl8?EshG zy|{nd(;36NJ*UMN@4QTzIL&N#2ep!SgUl1T5=CWsid#J_*@+U2>RJDG7gdwkhBUlr z-Q9CB3IF~;?1no1e!qzul4y?SU|mdsN=Tu-@Rw7u9~M58we!ge1Zs`smp=-@>>EU%UP9RuiCx%>Eae!94MKo!nm z%+^XL1Uc};?^j(wJ?Hc~`Muom*`Fb*5FhoWqHbj4GU&uM6?-){F#a1r@ZDGU}}UC1}I6>xzk>+Vee8wtiHuOwSvd z0VkkMU&M3x1FH5zV%`aYz)$T=yvsejl5=S$3x?;<3AhM8gdKAqvSPfYNJ1fNm`C-=RZ<@q|V=>Y&pUBex}gpdjr+3ed ziIx{0ZzjfX*dv(_sY=5(ms>QHIetV>6KtIL{v|nZ7RRQ7HC50j{+Tr4xk8tKotXJ6 z4tA=n(jp4*H$GIKW*&i6k3h_*$Sc-Yn-5E`0%`)RoVfMDu!?}*s}BUCC}SgFy_l+1 zSxh}tp_nhwL<=_%4q=)ny#LHo_pr>+!OKu{o_EGToCf!@5Hjx~u}GW)Ux4?@Bf%*c zhk`IjYx+gqn4W>px+~Ao$13KA7^*~jHD><^vjO~6V76g=r@$*JyS&K z`fp;9eNEYLWnw>KO;qWCvLOYQxfU~9?9iEE`64d{;iFb#JDo}lA$JW&pZx7Y4Whr6 zsyk}hA$KiGmUG1#)-KEi3OYYoL5L%CoAkk*q_>#6w|axTXWZ+>6sVY-&s3c^19S*- zghaCy+Vb}2PPH`LnMWNpw z_A78v`MA~eI#tiE>qMdoZbTc}A<%O1!36)iWZiD|PO9Ld6TsE0|I@OKDII3*y2TS} zyZb@CyTC`ENV8wXr!so7?67x zANXKMHZ3pKD@#STVouzqZX*JK@u~Y+2jmGtu)YOXxY4YC0 z0_lXYX}M7}F-RL#Rp!FNcf$>dQQO8`9l`MD-3oS^mrdHyJFT8MkNoj-%uL)>1KM2ABV- z>iVYb09VO%Y_9a9z$;b1E@ECZp8Jb*2yhfCWpu~+$g6uBs?udK;EgGay7|jbez5Kt;jwIJxG?ZmvVAKqpnjR~QykH66yrdhQp;Ay z^|6v)r2JWbI4*OiqdeXMEQ24prR+g@_)`zWldM#E-m>v?Gtoxv76<=SkO;B64G8pd zK1PfONQ2|;qU0*HCcgs!%*iI}KnkW}8%xm~2F8c!KAKEuQhAq}pL@)*0)B#?kCgQ-f|dWn!GcVDm9ENRxm zr2v0PGashdl^Z&3*(s(G`I^@x>+mEdzAUZ#jl%X_^EjE!#myU-aS*eugNsl*Ia-1Mt zf@||@JoqVyPw7(O*Xg4Z=}9#ANLarM?wEmJ533TpX$xu5!}<)0N$EzM!&0~>_fa(F zQNBa>nzPgzX89ZoRs5q$0`D(lTR>W*zRVw(k%v@xkI+j$0Ae)ty_+AZsF|Sd&s#C* zjSR+l8U3TZ*i6Mq)P~WsQ+!qd8DuNqUju3IE@4Bjyv}{$dxicm|xSmR32q3?kksk5~N9a zb^e9WaTl|wzwr&>-Gm~jo;`eDWd|%sBzvUU2#wb<$4pzY<*bNv;uk?UFwn%@G~#~D zJ7@MmGbRTuEUmIX2Po3^g?s##6J(w!sMn3*`FNN0>FX_9DrvMlKod}&n5@6XU5!pT za^eOriG5)PAxM+PWuz88laOhL@UefDBEEz6FR7f?hvFGx^Fw!n8q>CrnQ=$eRcVnB z+WY}|QC4heH)YNv5g`VethV-^2iwFhOeo@NT4zE@Q#A7v=z{u#?{6&R?RjTt-|%Jz zYrEG9_ECgmPXre|lF;RO9_Zw(ihpG=@nSLf+2uEZktrWn9pdJ$2U^b8XYAior&Ucq z$Z%fP9@N0DBPL4$f;EkwLomaTQECdB8QCCdN^IPQ?A}=4r*GBM`H~3%)XbKf_=5Uv zk*}vgGx{i5^Tvy+AllMpU2NX6DWovP#H=>SfNNcm-WYun_>@!Ug;)F*)^O-uv(rX1 zlE^BC_cjfB6OWc4Iut})+{(bqJXoW#45FVGaie#__tp$uLcJ< zgYUqiD_Q$X0a5z&c?-Rs`nK#@h9p$mgYE28wy6gU0opjy=Xm=BCNxT zsn`v>6rmMdjIK_ArL8;S%sL41Aom+&_oAw@K_9@M##vS+86)?1CxJ{F3P%pxgVhPY z%c6%}F{!~zu%p`S_j6=-53v30mYqC-c zqh44hO)T+lJ2`cnHlx|kL)uykZL)zZxO%^B!uY|d);7hY@oCw=4;JuR;Q6d)#bC>8 zk`5UndV~Qfj^(LZay?C6?_ZwG7S2>mGmQO_>JG!Zcu&4Cl27A&MlFq!!g{zEMB9on z)sm5coK_5^ZrxMe+KBA?NsXtE@2YPJiCsZYqHcWrsggol1ZkrNC*VA zsLT2qT!JP2RlgjrpN$cHQU*Q5cNNH?h_(0HOmoq&k7--HGOFtr zhO4JwRN#E3p8FRLiS2&4w^cJmuAfv8}FzxEX24aR>K{N9KUAE|u!I~!$^d_j|Z1={KB{67^ zT@BY(>zVUr&QI`|9PTk#&9Pym)2c60& zcn8PYJd~o8FOL@8svPv8B|++yRas)(I2+@A_sonxk3MUU1J1R1!-ohZcuitZ&$^Ru z>PQSJvd49m{RzVnAYm#)qLH11*U~iF6bW|jV!LAL|Dmjt6q zNcf@(a;#Vg3o1!hpN@8}9nE&Rys*&UV~cZHpN?|sG>Ax;i$>qF&(Ph z){mj7hU@CFZX)rv$H9gRPNGB1_b%i!LT4n$j567?JPUF9*1tx6tWrlf=KwQX9N|n# zu-5m~)^6_qn6)1f{ph*-6zHgF&bkM`Ie$Ch@rennpZL&@#=J~LX2&-SVb{GF4Iurh zo|F~i{wz#O?&g_{dqPrQ5aa)5;g@w5wViyJFuSu+s<4bbLpGe|{!JclH*Yz%EMk@& z@=3tt91c#O_j9PvLN+k=9BXp^hGg=-45*N8X-kRngRzLs2fT-)=F?6Icj%8Y{K}0M z3=U}qA8NA|Gui8yiVNXtzvyVUAZk~Ji*!7zTc`DAggGLN)lUoLj7_7vzJoo!wtYC_ z5Di4jzbt3MFm#Mxa_9ZDE{SfR+)YV^Wd4F8o8l;#mHu9Uy&-Yv5r{j~OZ8qS*cYz! zl-1sbTGj^Bv(O-%@P-G-eea0rd@>Q>^T+CW`fEu#EM1g7i7af{YD|ONRUdOyKKnW% zbTdoG59Q_ty;epTI6S=gZ4A&k1=w2t8|!W`t%F>4mX1dwehejmN5ZzO-Dz7IFKp)E zeVpML)T5`^7u zKAmCTDpKgP8{YR3wQnOEx|i)E``U0((0;G8XTgi09q8GVB}+qa5R$aoaQ@tGrNdg# z->JqATu36j`Blr@R69}pgOfxb$%YE9{a(C6Q6^{|qXNb00$YBgpfhJZA|dV%C9iXt zJjZ20lA9@YxJd_|K&P^Yy_tZvBTwq_(%;@mIy2H`Mzbl}DzNAZkJ9W|fJ4fyLtYsE zJDBEhm7||(55Y$229E~GeE42l10SG8J19$bH*qWn&DOr|z-tX#UVbxq`8lzTjZQQt zyGd465_Q;L=TNovtp|=SXFU6jS*KJjTk8YmH?VR2Csvo zNuDV~$KV~lpb2h=AD#Rp{dCFGvxsuI zn87Y=vNKA4dzF-4=rm1(R)Upy^Dj(R_^bL;jdP3j@eaAjA5|nKwcHOX)X3(43!&|OCfdA{Z**hW>i9CK3mP#m@O2B-3JBxqvZAbXHd`0v(hIHx(CV3DC&65rJJ@dl9sVf$oeD0 zJWwgNQ(#8P+E%Z_yVcd%%Nh}lc?%AAO)quDTt>fP4mGY0ZA4e<3f>+@16eBRG=qAH za2#_9*P@Qa9n0>XtD#{i=wop&vs#I4(74LyxN~wqv78ZgYmA+QV##61UDTNn*s|We zyKmTUeF-e+-iiDV;uQcW(9=P*t5G37yBgJtQilZUyT6478{i}=PzL&b* z)q%zi;j_{fI4rKmPe$78$bs0kobEKt;a)T|uLStMIX6@vGS^kX`Hx@sfGr zyGV6P;?W1x|rS4&$CfDE>scih$l>rU2Qu4281GDjItqVx5)kkTecI+l8%DD zd7^nrge$TsIwO4$sh-DVwT$ODRbK6BnSHzH`}sY4-z#=CR$|)50_2?<*hi(w^(%yX z7LSt)B|k*nnsqCt_7YmUtBazF50ZRJJDt?tgW8vs&{kbQSIEpfN^f|YS=FT$F~v&5 z!;q&2CRbnMnkBu)7j|?qVJC&o*o960)mM#!6iYg=>JhgJ9jrKM`HYO1-5`d}zVd`_ zjuGO@=D}AjQ^ajtH{`8J7uM+aE5a|1yhQa3{}`ul-rm!Edm+UdF-rKdJ3`pJV4qXV zk6;oCI~pZBGcydzTn|c3d*RfD%;i(*d5Pxh-t+V&;Z9fi49eL1^2S`{metR5;n7c% z{mGsjl})NJg`mRm7D5y%l)UtTvtkaM2DiTDgZ%)hLOH_fP=j z*N1?N1+Ly7u8oWH>Q2AoTpk5wmrwr#=Lea ze%N|BB9)Cq9{fq;-f=!I&D#h>M~^_6)z~RV?EIj}18t_#tK)jSQVi3MkpwlN2MK)S(_{1+y>PlI{n*Lm?Mymvy^ZSvB_7jy?x0 zc=$g*{{xeddq>?)l0Fk?TximKl2(|R_d%l~8FHis&4l@;ytT9+B8uQ+ax0QHeODmG zcB-c<{COBEhRmf(gRy?(8%cET>3x97UOMLMT_0dncrEK*KKTW3&oXc|>sz@L-!;iu zgbZlkjKvH`HkYUQb`~zj^x}VPT>u?{6qq6>sPgbiMlN``4xj?-ykDQjh=Sjl89a^l zkx35{JkipC9A@3`&;quSp)6=)dyJ8#uH#^QgrNhn<_{N2M#uzChV9XXBgpj;0aFph z-#L87*~fyw8x7HVj-_ghk~gAC{;3?KFtHRQo+%$<$=(s$QhBER6u1}gG}+!gw<}N< zTXd3It@e)vX!dSS znLA;aPME4bb_Vk_W5z{G{+!r%Y$z+XUCn`Jt<=c(9zO~T*cJA-z7p1v4Kb)#-0s>^ z)}vr9$i7lkrvy}4jx?Za(Wai!F*}O8=#KDE8Ko1-A|aBRvgEu7ce35A3B-E8c_i6w zR>+6BeSo8uS#pdqb>=VUUuetNb6Z}hXlQ+QKeZ2h(5I`P4#U1n^<^Y04p3$>u=c?g zC>yb)11(G?M-h=?G!U&=z~m`U4G(F2SEi_LBHPY0X?4*C8!$}+n|Ipb)i9*R;zHEMGxq5im`T^Ufi+&*oM}+e9y|oHzNj zYJN&nYsXgU`bxemXhGWis>k%oSb$zFfMd(<>p+lobu>kw{+N50(oYJf1M2NndFfwdZ>r7;FmUXrXr_wzD8wQEF5OTE8X^Hoz%A_L285z)vL7ip zHZP!qAy1N5->5qZb%SJ0QQymv;?f@;r{^8;aKea{Y8Oh7^~P#xY>Fw<*9ba48ENyLiKE+k=nR4ix-Lec#i2Fi5bCuE2Y zTS!)q(l;iVcn78Xr+Ht_XEKk`O9P)RX=m|NWz{SrEeWch zY~@^O$H7?pT5n{7nYLWr%^RQ1Xx?HyDv0bCb;ZxIpV1^%(4tQG2Y<3t+Ix_3i+};S#B^IyqAM^)6cy6kw`aNta7Zm(Yco`6RTutTZ_v zjBi*P=UFA-oW6K*a()%$BvHxG54lxVZax6RCEzLHwwMvfe=g++iSNtF(4X`ULB$UO z$vGLw=*c+eXb{S;TK3BNxuX|cUF)0!IB$6&zx)oM8xHoEMD@{dJ*1ZRg+QP!0eVC- z#*@li@9Bp^Y#A%%x`Litf3V&%mynl;5rlU@W+(ReNt$A?mf>4*AAS|}ZpP*`Wu>z2 zp(uyIWy*L34f@YdvCso<{9j``wrY)|_3QK5fQpMPEQ1pk2qaV2y;@d+RU5e@R6fB_}9|AR;4$A4})Sm@Hxs+!@ za|fbHVMyV5pjOJ4b>;$s5Td4Zwi3<58cfE5Wc!3X`&JEJ3^8!iul$7nZpsD>R0$>3 z5#&P053y{6&xQM5bMnCRufOIqVj*3=Ajo4&ZbC|@Bt3_hKum#} zdG=j81sE#~7hV1-$2~Zqp)$7gHS}}WscJAPeI+h=jlLG;DD(p4;LdZ8;Bf{(#YuUo-y`h=<-^B8B_Fd58yo-$JZJq?qAbN=S25vXTMcahjA$9-+su$ z;1bwG8g}hR{S*1tM|jcZ8IheM1NJi%RwUx5fzFGx!KjZH9%{3Mx~l=qn5HEQdcePxfG+joD8u zQzYR5f|*$4pl6)?QMsS~Wp6e8MC9zgJ&J%czZXexWvN7ce96zKG2r3FL;M9qr$mlM zD1sC!pclU1l3VK|lW?7^uv(R~jjfPSFXg^{CmALrKc*_*ZsWs?)id}?Y3VT!2+D4c zynMI*i>I3V!B-LM&*xK;k1Pf;6Y^sAlObsDBhwi*v@W~Y1b$0+H)y{l#bNM1pja7ES933xH&PKqH=$hZbr@D>eUpotXeM}7Hr!P{=x+Y#p%Lh#iVWBq(f9kx z7~nx2&*h;@>T`fMZ?=5RN7e$Ohr0`&oOe!uM2B38yMp?Hh4GK|QQ;3&!uhT4pL=~v zpu^+z7z9>%=kXL%g%Ld+#8LUOE?tU1;S2=HIrJ5$uvp%NKWzwXr|eB=yl){|nLgxkgABqXjYmxc5Y0^Ji=8}e> zreg?yj!-*`LAC6}ly^hKkYDf8_zt7fnPtPzQczm#?U-sFufAl*lzA=-$LAC}{`?#^ z)RW`lk{*+F_}5mozZi2IY&qWwAF?cqRfps!WG<5Dp;L+|gZx=U*>OmK1Y!vsP8PCJ zM|8qwCp;%vaAf+kF-O35qEm+im1u1@ zKjRz@k)@CKLuz_TO1AQptj!vOHY>y7uZZzhphrwXF8X{cZw2A-U3T8rb9nSM0ZKq? z{GP9rgU7-l=g(@#BJ?#GbzdhR8OhRHC0PMF^cJ_IH@QdpwRH0$;TV(_V?vZZYH}E{ z*bgyj>&iG5t}%kf32zsnUxSm&7|I4OWb~UCg4e^`OhB&MQ_B!~KmX0`_-1-RD;>jh zePQ`RoGiBt?ocJ%x#?cJZBu9cuIuf1MvWtB|K zDTPe;7C#eJna*_LKLfMgRV<`H1yUgQ8u)F(k+LjdD3#D8)dqW39%BxyU<2@5>j7H1 zl>5!>8NTpE=dJIS+gDu(|z>R^ya6+yyQ1|d;DlHYItg*=Ox z=hY^6nJ=hee<>UL%#(g~FRK~QMbV(EMcG&Cojoi>E(HjR+FtZcXl&}IMb zXWAKbBl>I7=ugS@Za5F>xaFkwv`1;wN2surK8+0KLj8zIYH9OwIdr@LIA;l~Vzs#- zbCV_L-@M36l<#haD2$E@j-K_8y zSm2%pNhqJrNYnRmID%6Hj@K{?OEW(@{u}mNGy$dPFq2{k|GiIn-WQG_G`u3!uqO8R zSa)5(*ML`5;&d3IDJ#9Oj~NM_@H4^DjO*`qq)!e~BpG9GN|CkqcLs6j?&?WQ&4@#o zu_7Tf{6c=@n(8ICnM9Ea^_JqNNrA@STmEqLD;37;E-e$Od?QDF@UHEF8VZ!qTLBB$ zEr12S`Mf|AhA!l7LySSAMv&i>%q@z@x2#>Nem`pM!uA4%_9kq@p$J+O24ibgR8JgZ znC#4asuvYyXA06*t!LDmW?eLWwQ*&3(&_h3q=T2uBD>Ypr{jQBU$79HKV`CCR(aY%n&nId-FP+R ztB&-f*q$}5uE3qV zsm4D_$bF%n3OibT2g{SbyOCc9ap-1|!~Ru=+ks$C;9_I=n_td#nTq%xH|BW#8P)b5 zZweJ0(B(Z)8Nv$?5#Qu{p2tB3I!NI-3r%Rv-Q#K@k1V+A5nDqjF2av19ZKHqLfHZQ zPHA~1(o!19xTY&2nd`pPe?CQ^`GQgx=%-xuRBjh>7ipm%`#2fFyl)Wgb(jQ~u$kY^ z#x;pe1*<=b0~$h5slPwxW>9`EF$cS?{YrG9{_@bTou(p^1=-X^dKaA6F(>}bVGzuW zX9+OWbWH;KHNBe{15ZVS^3Q{Qe3~~zE(neawB)8GL^Kh}3iIG44dL^~eayZE&_4bW z$M|3!Mk6G{W!PaV7vC1!Y3W3e&t1VUnUxWdgDFkPVh-ny zg>&=B5)8`l1t7~VoX928n=u3xJ3K{n2H$$@=klYP<0M?nny~Y+Mrbc9JI3X+3ruxz zVi8wBBkLUV9mmr`^R-h);mcdp4)Fn{m>e@b2wG6#YvY!+WH;3GcYn-4It{r zSEfe^u?|&Umt`G*P=k~Mc*KQ9YGMkRKWh;HSMU^4-LEcEgc_A)oEfn%vYB~Y%(j+X zMi`4lng00}CYh6f#Kk=zXSQ63$M5%zYLWXFlDZt`&LGOwJysQ@ts@BzI zW@!s^jN6M_v=Sx!fiW!FwAd+~!YDjFPTFDlP_n9ur!XDMGs1GLx+xj|)N zkWQmY-umN8rjQ*zdjV_V8T`oLhu9KavG}5+h6RO%ss6j6+3VKNq%B2s3Sgujdl3uF z1yp=Zw07!`s2zQ#w{?1JdHhdC&OqA06tN4BczInlsj{O<8rWVpvL z*O9;^_k?=KRb-QENTawcg9GN*=n4&K2+VyFHzH}|2xJ4!p6J;r!ERpMB@gV9F0&4T z^hdwnDgPc8kaDE~9aAP+S))yhk4P>PAX_yrU33`n9u7N4`WzPLH`3eSo6)A*A7W~1f79z1;59VUh#;Edk@8PM#Zy-wIU&zykmU!Uy zEyzerp|M*sR66elV-y@Q*>kN}vjmhH9*F^V0B^BzW+$^>fOTcTdda*Lp~@YUWOau1 z>`=K7Dh`Lq=z)0Ul|&{vpcR3%l9{Z~ffAcPT3bvw2it(zBK9Y}QJcpLvC_A;!~I6; z(Q!Bjb>8>@qQ7#m@kWnK`!I9`&9fugEllF~@iW=%G4+@R@5Dtg?Ead;>3PcarclSN!}F^j5iFm_l|1U874 zmF;WE@8bBynH~cc1$q6{4)(XX=lIMCl(3FSvM+brTLWaaySmmeSR0f^dnt}OjCp<# zL6X5^COPXUwono3s^Su{hiGo(==Jt0S#YE+@Q6qi>=`hMZH<}clzo~T7`I5sc{6pVV&myPNc$$Y&?CF|i z2ER{LwvlS)iSZM;x+R#N-(q4VRusy)WD*pneK5>l(5#2#GX8@ZMhPo;jo>@dciKu@ zePi>$MRn&LY!W2DxmUR>sTrabs=|m*_@IZI`G$y4{HM-&4RMrGb1_jN{3BbAIf|m@ zR`GB2#HNNb*;4V>1^F(CZSS|ei!3-#|F3UV5Dcc#VLNgUN}LnIwHDzD>2p+5W3ao6 z*qxzjvM7qhB_i))@+~C2k_y_nTx2f&z4qq$aKbXVg?}bAE6O|cpa}hnjubdwg>Hs$ zjo_W={76QraaYD&(p3CTc-rj{4^p^FlS!fGH%dVtN*imD1guRUX4w1^9p%m{>c&J4 z14fy{K_S;pV>EoALle;|b{0^IGKp-SFIj98UN8z;K~xK^w;=M=e#FB4HXGCfBnmUh zc4fNTUx4IVszlfcA!Uu}wPD)kULcLydrJ_+jDnu^*ZA?(>@AyLBn0#R!2=m=s4=SD zN*e}hC{K%*pQ##E5Nk|TE+$2e%dbWHOB?t3+R&vQh!)JMh#Z&NtXlcQBEpb}&ThYS z7m4)o{Y@VbK9M-Soc0l$CXm{WF1I?jX3qy^92xixH3XlqM)jtxtzKq*3Y+eu@vC|F zFq9ByhFBD>=3OaUn&U?`4&*eWK+rz) zWoDdLzu)a$NfA(*I$CZYTn*gwGUjjXp8B$THHm)#;c4Bx` zF0D=>*!;mt!C}jqZtJWUH#fxCDvB6 zjt3@B^|>SK!kM@CGEGcWb!@X5Sd52|#GLap?&j3Gf#Lv76H5@ZpiIc*cSi(c`_68&M}QKxWm(9uoZ>+6RJaO2I1C}sGC(c z%G;nFbfttn=03BaNO`-ldkkjJ!HJb=&(6l%+FZR5%g`V;!XzSa^GmwBct&5tQbY$y z5m^Xh&;d?KlX#0!B9I&V;4P_;A5BY$k})Q1%cu(g#8v z@tL*E9*F*n9u6OJa^i>@^J>*gG~IK5Bz3vBTXO7#=^u0~2Z1Qy(G7xzQ4|dO5I>?x z^^2z10Bt%War>Q|@yg1ve5Gv%K1?ZwN*sI2hN?ybW!w;Hxt_fOjQ2Q4AMxfAfKQ4j zcVvn+*NqpTNf!r;sK39KrGY@qo0$i%%i^zQTvo1#8OUd9rK38eYsaC4WwatPhx>dqE$ix`aM&NB@Is}2V4gxus5z}4FcxTlAZt;4 ze9CUwm%43V=j@6D#kPJsj3*OYsnU8nW$Esys$k@u=H&8oP|rAb-?f6&>ga6-5|^D#ApJYm?-<+!>f9u+x=@c-!p8Nrq2Hvk420 zf3ArF3$KWBRYE~nNjZvm@@mG~O3Ioq36}$jR}VtPw5l>CKkWFx_rQ%`0s5!iotn|VG z)T0*@28}(;+ff}II_p{n4t@#6J-2u?3R7J1YX$?xLpF zkCV(-nNZ;vFA4$vZ2O<;5WkS(h61uOB3PS=@zCStb0o1QX~&X%Dch@FtY3sxq7zz9 zbY*hG_}+D$Hv=C=c$fX7;9^Y*^&kwCc*Q#Mnz5)q>reT6(PPjo-3?y549y4TU)bvH z8jG$ucInx#*9z10La1v*X(m2ZqESF z)KLIR>!cxvg)3{JPwmRKeHyy$yIt1rfp%`^^9Y9D268Izd-!dh+F*o&_8Jh*x5seY zv65DpfdrK%U`sgnt@(3)fdYxCh}Z*BmTz!{&ZR`549-uy)K((E-dG)NO`yO(t*cZT z&>^H7V@Yd&`4ThjNV(jz6T3W5>(+Vel#9JliD$UdzyX$N0=CM5adi)(Np*xOMXAW- ztElW4P{GkeJi#+Z#Mu^*s2*G+h`_>6Tx|6Ihys<&Pg+!=vmqk^Ni{kchEGN!40RY} zFqmh!&yk8lHM7?PHSsWI1nz z*}fIk9-AD1p?$Y>3L%*Ng`OgXH5=nBLhrQk6p|T8Z|Z7gV>q%=MLg)*qf})glC6yu z{RePdEel5Y;gNivsu8aU-s!51h^B*lB2*5$y!?^fbOw4tav9^LGPif+;oap+&v9@d z#lcivkW&IRKuYo3Lz-@6KpkglM2sf8o?;^00h$|UeS2@P2dyQ`bOU528N)4s5F#3+ z1SX9*eFrTcoEn9`*4)F(treYN%AG zf!k%=3W1P7t|gnPY3~U0Dj{X1$x)jS*-+pB=EhjhaOp>>bo`7UzNw0j(JRSI1O&9Z zPN@HrK4Qe$*Kvmdg71}ITy*07>*i)=We=bgdm#BHUo}v>fXV#6BQgeL^pL?Y(?ZXg z#-=D_wbfD1HbPcT2a{JztjQ0~=TVlUf|M^0#Jw#@WC~Z*n47mHx6Cwhmoq8* z3^F94nHTp%{%V;glObNK0$|-UFC_evk(ItnqylOMlqv*~7*M|i(}1GJCR*=dG}1ts zQPTv`E)ai-z$u-ApuqUcVGg;Q2L$TE5Cm@s!fu@IX(oA)NkDwUi|mi!gPI@}%{S~g zgb++Fw7X$ia0rG;gjM8AGz_qqX2HP=qzcy(U|fmOrussBg!u=A5+-~C9&xjVKgfKU z=i-81?LKh+gTLvz{yJRxQH(lBj$81G=)?Tf_+9Ioy|N*du|pb^H2k`Z9T(@PM|n4> z>=Ut(p4zw|0G-K)JiSCG_sdl9VFH>s00MM1h_f#_B2f)wQqxubA;WYKC1dxm7UWrza|435u*QKPY2pZc|c z6n|gvvgW2)cBwDU;gow;$y*v<*~CYzDw%IhkEBFUNk$L&w9F!dYuFIkhRlEFJ_wDx zny6z)@(k+zCKmV_Xa>A6Mi;NwX=P=9ctjc%XIG*q7NUCa<19}r+TxLx2E;(DhMzdE z+6eSfBLHNU0*@>UFsgb84d;&+?TDoglx9G0b~;xzVP%q@o3k=#68v%an8h!fE}R(# zlOQqju!5b_l3$x3q`}w(wGNkgpPS2rjMMWI%*WT|Vic_dX-r=fqw*C(8#EdoR)St( z%!y0^kwm{gHcWc)f#<12zdJt@R*Q?hG^?7JcEDx%)e=bo3wj@cFrqKW%#Z^k?aK{ZgS#Rgyd}^? z`@4}M?-4YiCD9pg1FT*8$-?ihUc(cWZw26aAz1R4G=&8pTFCaJWbc9g#?1S;ZVF&IeVK)LcIDmTr1P&1L z1OL!UnYtFnq=lv~u#b1!?9{f&K#>Aq2$&*Zk%PmP&3AZVh{E&J>q$P*tU7p#y*%fDvTlLfaFyb{yV{2w}cp#pqRZw zMVo+`P-Tps>W4cxZ^--1IFrbpi)04$XS@O9J^)}4EY7A}m0@xltOpIg*k8K%JH zuj$%Xm4Z_>UPWMl+5#eBB;7^W8>rPFrr>~Dtnxt|7ZsdQ+J^0I;#!(vl?|?qc6q`3 z6%tJK>&ifliYAO_du@%@PZL?JRlwGe`EmtR=>h|pn$B;RNDOx95Ub+@MDmT_VX@_z zO+1NLe%f{Em_8muo0cIFv>L?;PYytwvUHEkZA2R20006D0)a7L044J)a}v$i6%RpB zD;5cLEi;RVu$iIJ=Gn|E#TszcTPegL>aNc?t(KRK3dThjMzD=#8d5a0Xf#UWaKgSq zA3Hk_jLdw=NP*0sYzo7}Vq19bs|raAavo$b$ib3^OBoiU#E4)@(3(r!P*;}`%nplS z6-vmv26Jv~U!ZZa{;W7Ms5P9)A~jjTHoxF9&7HE0LNVIK>eiMcE9LYtkSFNSo-F7A3h~W)PSFdBIMMrwGmu zF9`v&wy}!Q3}OKz|IxIwoxlUnXJTWJGZZjs)_Fg{H@QZ)E(BQ?UT6l~47gpU2%tLz zSBX~`0d;V20T2<~dWZ(2Czxo4N8h!F)^d-e@{dihg-?ua;5_#=6qV7a8KyY{00L}F zDnYUmloYs>Gl2B4MncOx;1^*b+~6tVJ5M#if$9VU6pJDk+3=d0_McKZH(10NOorCM z6v&>Ik(yQ!?WTv$DI8%KiEJX3x!b3J^AK`KVv+ci)v+0Inx|eG#3^E8GI0&K=~316m->6-3){Z$XTJvg|Z912aFTR zd4VfUaZi*pc3!wqnIWYv(_JwY+YP-BF#rEoz=Xm+qj4XilM5}_VqwPE-I0?5Zj9exC3am94>;u}f zla@rxgNcX|G8IEwxpY}T1r_!pxz#DROwEy~vXZXy=uMl>U2b6Q=GhTj;cqnrNVMM8 zGpE$qLnREfGf>Y%MGZ7HP}f6c7q28Y!H)T<7L^szn@BK*vp15I9pEv5$`o)Jz-a-j z2GASAm4*f?yLwlSGNdlgoN|kA#opA;grk6Is^LJ~Dh3ZuWhVrC)={vzZ2=WR>Bibg z_Ro$Mx_%}7RTlk8nE_wqj$qFW*k?ha8Sv1Cj5ML9$d+m{lKq^T9JBe?GVcT`CN5#_ z2zxIx!Wiuz$USBfrZNEp66r7rYD;2SlMt9B!X>#f3HF@J(s)pSdZsc^oN3IGK;lZ0 zSb^l1B*7+0G)b}w5_pM0wS|$VbNFCd+xM~?`>oQ9;_OU2>?0WI2;3yWnWBy7eD;dw@(qZ~?^ru<&Yf2PbBg@_1bgrl%l6T_q7H z$w*34Qxcq&1gRxaGP8?UxP>6^nlHFqOC+nU=1M8A5b6%+6&pqJnH3U$vV z&e%h3+uxhPQ{lDZ*j4`gl@bNX^Ol>7w`&VPS%!MJEA0Fh+PGk^3)0l~=v+K7X#o*1 zQ2mw#f=J;}BH*fR9CH06w;>6bDlz_=Z2z&ulz-49{?#T3lo}59t|Ua&HnJ}uOvh_? z7ANrbPFMmPWEvYx_VAkQ{lNjYG!k37cxw?uq0Xjp=x7uwIY5r~RddHG!>v=m_Q zaisW|2+T%uF%gW5gk2+18pzO3Fd~{rgwN9{&Ich#P@;T5R6Fs52NiRDn1rljSwgB`CkuvI3K_y&@5>Mn0Bgqj6^hd%zk?fD; zOC#YRE+zYg_<10hf@5q~rGCR^+f6-B)Yom@EEV4J{?_8PJ0DVxu=lOVg(YB5iFApi zP9k{}2%<$IDUnc$q>TtEaEFJN~YsU^&ws$f3k>lw;X9 z*d$nu3SuNgY*5l;ATb!ooJK-2k(i9+Xd(C-KR{e8vI;l-i){=-N4!FdG#x>lJZZ74dTyaPJxzuum)73bTD+aTt>? znJBs1G)#7CDmm>Z~1*aAyW^X9jR*25@HwaCaRo^f!=zL`+?Ta}K8I zOjBn^4Jj}{(=$Ee0-PhJE+K0Dz-3Pq|F?dOHP539VT2b5=91XU)Q#7aCMs|^62+UW zs-;fE%0ZyTaR*LyGHT4IHwqhE9FlEf#2p*2kvz0?Jg*JZ$|YsBD;9hWEGvn`_Gj+P zNTl@I-3$>Pd9lhR9;tigE`1h7v8Fh>NiPXsVW1hA6tp*$39s`yOF zOOpk(VT8dpi)4JghB!@zm}`dEYlhe-hS<+^GFvA=&!#oeeMtdNX6QCM4*9M&00fVw82H3vUe+BA7cEkaA6_ux3TeS#K_7+`X6Z0|0Of9TMmd55%XA zQCCqmrogy-n&y%#$farYBZ-+liR4_Jf>;BBcqxLoErR$3gcxm>Dha$8LEP&p9A)vl zq4W-fJNwR&SnCs5M>$YC`W*6uL5q(4EV=Su+^A0 zf-xj}qB#pD;7$TyRtex{2HUo2ux z_N?S|7ru+Yf?aEn^8ra{n`1!OlHH-0uO(nUTfmG7z^n^^$oT=VW@%C@;8!{BQ=BzU zxP^y~q=5W%p7*49*hJ5RGVJt(XO^-2Dvq(%I>%V+9b>F@j<8w}F0q}ygig(C<#}C( z!O9{WyC93(FpLeykw$SzHYH3h;l&u2hh}t_?5X*=cd8Zy;;^c|hL%r+z2O8umTc@l z8X2D$d*r;b0EC><6$|4;0LO>|fH(wzSO$*}4+MD}pgF8-B=W?n-qwoHyqN7R%3h%b z-a?^#Hji=EK1bO7AK(H!KnyKYWTM8*mhi}DegpeL2wM_Y)mOvgAD8^6$ zV1(uN4S#)x%?<1I(*1|IWdxr{(wxNhFdxCIG&s<7>6mzX%S z$V4lKk?I@AxcMJr^nZsC0SC&QF$Fq6f_iTX7UASUX45-$lgK%CkcdwVVeB@C(Ecz+ z7{v|a95pSTkiu0ZpiwZJ@%2WpU4hhnoj+295nhAy%P0j44KKj_PMsVs!*E#5GsdOlG)P{S zwnrUmLSv&EdB_Qyg97afY7^5^}jM0)FMrcsX-8M!@C#WryCs1X= z4Z$UvxGLzijH}R467oCS5g;XUa!Rsy4Vt}GC_Jpx)~0p{^Wh~QbS?-~mZX0+GX+V-#bIkk&GZ7)Lg>D8XMlyc81=`3m!1 zV`PH$4B!ahvW5{=V`O`F;N5N-spq$*HqYR>XL_Vo(X^Nu-`Nr|EOJ`ifE zG0+a;Qpc5JqLlaoT)Eyir9_j6NRKa|)G&uI+8slD>%dxN`#1W!4N#yllBZB$X8bdv^LRmwEXIukK%m)Zh?kqkL zL#Vc~t-`uz{~DmoL>)+%1E}?rRgLgmeu9<0c&Y>qpM0%14N0_nlEKc&!-(FQL6StL z*%(sBF#@uGGvWi$o=kw+rrZXSy{GrO!K`vt@~a&jF~K)mfnokfUX%}8sfgLew98|k zsCqbZ&efpx4gEED0b>_!#xYl$3A%=i)o~}O8PaU7nkTF2i>V`}fe^OI1NkrE z1S*UW)-c96#Tg?kGK{b*>f2`$f@R%t^f4;Vk(<748t`bFJB;7zLDM|HgOR2)YBoss zCy>eCV>qeU7gt6>mf#WvS+>T&~6ULHy z-C$>S+g0)E7nn}{4C%K~la~_uYGYiXEXb-vUQJq`Gpi8mayuNHK-H#V9uI2^HgKLv z+z(+T%o2o9@)|?feGlUVVTLi10Tb1_p#V_fcyWl*2LU5Y0zhmA!5jv_+y}s<3BdbV zAvo!dF$Bf8X8>FmZXEru%$Cei$kCQ`LDq|Ph2_--PNA&$=y3@O-;*K0I7l1>jWPNH z;4%ncHUpqO1RzIXVO)6$Y?9%CK((#dki7;c4at1-u@Ms5qmtdM_B&=5G?>O1psgf0I{YkVTMAZp%jS&CJI3b z3doy0vXAuGc86lowG<9_(M*X1gJU#lGt5!eJIAOGk1_HZ>1q03_esA`e2Q{q^hm&- zNC9I{;)oFX*b@+THs6po!Dno}#5sph?iRzyTu-DcEKmjj$poH57K;t{!3}?X{l0B1+Veq08%kDrB4IVbg_ABlZ1x5(t8i~pSFVF)3 zZ~(BIw#foOYe#oY(02{rYITLLVI7;7veBbFU|4j}kwNGQQfoo=5CruNs6H0yxqf5n zN#V$6BZXLBAh04c0nozJCw#05zF3V?An#ugvuaxoj0PfX2#hm*ssu<$1%VL$I!B1_ z0I}*k$H?~|pm_-|v9W)I#uc15wgB6v8-o8q*=#G4O&`o~A%5)Ul8u4qAbQrNTul`h zu-g8{Ld6ir8C63V;OXU#7FKBif-sI5!&t`;Vf;Ra(8?ddBBngJMXV_Vfe_v}M=0k2 zk>WhZXzw2(V;)~)g4Bksjg;JmcTO(&LFX%S!ZJj2aL$?VO#gAbD3@nSim+hD06*gE zeb`7~1UdXmG2z?_WYQ=XH!%Z-f2d~bakyeYs@(=iO2v{=Leg_*9<9*{FaR0Q%aFQ1 z6N_9CGr4OspPIOT<5uR%Q_Q>PJY?CdYL8Lo0Hf4-k5T45LeGhMgXP!p`>_JIB7wwA z;;;&K=UoI5T6XwW)pi{GtdV(}ob7MlcGiGn@&pQQ*T^C}Q_HPH4O&+!Uli)ytg%9k znn0kWB8KqZF~jJ6525rihtMNsoFdAviczT@oXdZH(s)~Aa5*$Fif~|H&xpx3{C785 z;3UbIM5B}*Z$V~4a3aGBGJ_e_5-!{vfeiWz*jC2dm7c)4Q&@aG*tr>I-v`p3%lIb- zGBYu%&>QI$g@aR^Px)5OzTLDqv2sOWWngE%TU&xrhgt=X2WM{?=1B-Z7zM;?ea`F^UOSnM=SZ8sg{X~+^b(uOqDo)F2mzT3 zkhBt8ut1o}1jAU%8{>q0jxowP$4Ki5Ez<1(fD4lNgo2_zp#dL)g7GKkLZPTAT}5O( z8$;a?1BZ&GwaLIpp4j~3;6>M(=3MhSo!p_z(qMt|UIB4jgW_Hb8E|6Qg80m4ZMqz# z7vw);ha)g_H9rCXaQ^~>FHmiEd7^-- z%oI>`C`pIX78hHeQ z(2gBLsM!zWBw>s&vNA^Ob2Jz%!i_n7R*9szI>^NuV}yE+G0Hi|Nb3qT^6edP<3YS9 z1E~sukm%=ajes}LEZ7WU)I0VM3p>|rub^al;%4fM*@N+NhO9i3pKOTt$y9=7GQ|RU z{M@9HPy%KiCQBSeKp1F&_>X|_sa7o2kTrUKPQNByRHT-8P^FM)D+?jSIgJsLF~&&8 z2;(FUhY`%GFm)Wx!M~-FGH6e7k%{$?hSbhJt{$8?UkIJAR4Bt!^+JT2cS|EAYmO1> zILAoe9V4s|p(V-zg2;mBTp)0szLVon6&uC}9giWy7-7(GKC$y^7HN{?Xw)56`;RsL z73cc8^jf+vCF)_LAc|V$U-GNxKf}|KBCkABY9M4|m%&d*!vzx_BDx9oEn@=47dNo9 ztV1S-YGD?J4J!G&_zhe{2CfpXnnNIbER2!PImgK79OImGj&P&xE^tF52M}-gjry3dWDvi8i)k2-C21zW~IE(q*SyM8)nv{l79$Y!{q9y;o8rWGl5iILAJR zXzEeI3LU0tH{E96$j-1=8wAflNPHKl;P>h}PN)gi`X_6fKc-xuHrlS|D@ntV{UKdN zH4l2xUBC#K;VgQ^)xj_W+{YgJ*y$_SaC=9u!aGh>(He_GnOL81*!mnCZ+ft5*6MGQ zON>9c6jj`&Kp+2sW7*|zo`ppQS_PN*dcHeb_D(z6gJLNH79<-fm&p<3Uj$6VXtd;Y HP}6o`$!ZxC diff --git a/theme/neo-gnu/fonts/lato-italic-webfont.svg b/theme/neo-gnu/fonts/lato-italic-webfont.svg deleted file mode 100644 index 7ddb617caf..0000000000 --- a/theme/neo-gnu/fonts/lato-italic-webfont.svg +++ /dev/null @@ -1,281 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Copyright c 2010 by tyPoland Lukasz Dziedzic with Reserved Font Name Lato Licensed under the SIL Open Font License Version 11 -Designer : Lukasz Dziedzic -Foundry : tyPoland Lukasz Dziedzic -Foundry URL : httpwwwtypolandcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/theme/neo-gnu/fonts/lato-italic-webfont.ttf b/theme/neo-gnu/fonts/lato-italic-webfont.ttf deleted file mode 100644 index cf9a5bea2a6faf35c71d30fd63033f0711446ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53652 zcmd44cYIW3zCV7-v}7_fnLe2$lPSqedYdGZM#7{wNCVPHsG%bedQp%n1W*(VAa)QC zSz?cgVp+t+#kA3uG4IA_kBIp=vk zpZBLeB@|6jlm`EZC~H~SqzSD*xL%+rIuTbR%1cVi=uCV=(G~b?Ew8I>%$t4k96ryZ zC~Z-B7K#&skMzM=^rJo{Slup0A^zykgmM^7@R1igl)#3Zlxr^4$c}pMs0X|Qss8dtt zb@u@jee zbuJC>{xiP2WX1hmAi^!`9bfO~nWm-q7u>@q{+Gd2 zDpf!+C1o{}DCMFVEAF7o-1pS*F!y_Mum7B0*x7XlB@=#0p2I&yM$sB4_p7z$ zQ-jQOW;$yS9TmrmZ;FmeEK-p)UHUuGQQ0oh(V*<0y;2ct2)-#z578*@qx;42if{n08Iid9zIR21>FhSjNfemZ3S%uZ3pcD-2-|Q&v^p(KM6Vt zItF?QbR2X7bQ1J5=oIJ~&}q4C({*gU*94;F%xdy@Q}n(Du(jS8;v~ z$1iaF67)6R9Y;Ba2Pr2g9+VEs0F?}1MUSqcM_19KtLV{H^yn(J5Z^5Y?F8)y9RNKD z>H!@D9R@vt`{W>I3GBWQRp6^x?-q#E`DNnRjnFBLg_in4(0z!H%`G_LvO zkTg7hlq|X-i*CrG8?xx8>hPO-Py@~zah!zXWE`gq-$ym$*fM+>y}pcIU#8m8dm^(% zc=zJr?VRkoaK0M%t;OdJIKLCe&3N|~&{ohk(00%c&^@4kFY9i|x*M|YhOE0G>u$)p z8?x?(th*uWZpgYDvhIegyCLgt>Uq5T1sq=ly##t0)CcMZ4dA<1L9c<%f?h`--URVD z=%#*!KK>eg`Veg%1bu||e+>ErJiUzLr=ZVpeih$c!|@9ozXW}ae%OGa3y{WT;OGJs z04by0w+plZv>Eqr0c{0s18oQG z0Nn$66u-RydKbU{2={&rx(xah^fkWEKr5=yf-1bd3Ua>$nO_2uF9G8PkohH``4U>Q zfy%~PbI|TwXlnlOJhWyn)inGLR~!sJ;YLUjnKx0o9kNhw%I(poc+^fF8v=UdQz}L2rXD;PZ!g#vte;Jnv)B zWzeUftGMyMdCUmxJgX(d0q2 zZV;^-MC%68xjrW6AQcPS5Cyvs1-lRh92^D?4g&{=fq}!oz+tKq=xYMr zTZZ3)yx)hs--5gkLzkn#@qWnrF#LZMINuLFjso}lA@9SG_hHEUFywt0@;(fCABMaS zL$+^0wr@eUhan~SXwXOa-N&HIpie@jm@(gDK zp;bWWJRmd?2(3bEH=wnr1e<$|T7=*7Huo6Sg>%m4;>g?FV`%L$wDuTUdkn2ThSnZK zYmWhqiD>Z#w0Hwr41b2tBQ_Vm{}^-`^eJex%}sz5Rsn0pz*;e+u?o^y1$qiev>HDKr(Fmw$Vx&{ng1BR{vGuMEbVqm5im?;JdR#AG+ z^82m6-}`zX`Rw5jILrONdE19@-x1KmphrN&QnvkszRiKY&4IqT@Ww|uopa(C4@!a* z({aoIl?dj~ ze}%sN8vXbXZ5{;qb^R*NiN1dU`VvI+z7(3A3y$|en{%Pfxj^3$pzjFK*9S{?7Mwo| zj`xAnhr!_nA2`(mPW6COJ>XOiIMoAA^?*}7;8YJd)dNoTfKxr- zR1Y}S15TXVi&mB1uk}hi(TMi7wqT&us8rL4giY-z~TU~ zH~=gTfWuyJ*b5GO!C@~r>;;Ft;IJ1Q_JYG+aM%kDd%khhD@Ey@(xp5j*r!Dj=g2s3-+0N`Z=vK*dH#s}xcyg>*{M(^B-b z6g}ODo|dAgrReEK^l~Hj-g9{GIlS{6Y|mBLoDcB6b9mo5yzd-z`6_hzD&Bhz?>&e2 zp2K_3A+Ie#>&igopbAg}XcFiN(37B}pktt?K*vERKqo;@gHC~-0i6at2YLbYBIqU1 z%b-3`Kj=It3cZ?#Ud_WB2l2*1ym1h39K;(3@kWv(4dRW1c;g`6IEXh6;*EoN;~?HR zh&K-6je~gOAl^8LHxA;BgLva0-Z+Ri4&sf2cq7S=2EnO$;Ltp9XdV?0t-FL4bfE=Z z(6&p^u1jdib+qIuBY5wDLMyc^$31j#gerE3c!K*U`%BXytXZ@;X}C zg;sWD`?RbwCD<2bOkNCf)-sti>{zWSMY?>cml~{ zN%neWq^~@;|Nqt3fJ8`N9nhE4=a$$YeAKHl1a7;d|eWpqHRdg0OEgJ$*O?ek$Ty3vC9 zuovBE#eCR|ZXsLfg{F~whhz%fuo2yO^L)H{KHfSXZ=DaD(G8o?4V%%8deU6zelQ|s z1+0LY(ts<`loK&Y9HPx+Dh1xajSMLhmJN|5JW3vFEaQ+D6~Y2kP?c0QHIb^L>Zt~* zk(x}kP_2k{rcxc$LfDVR)KXZGwXh&}Qk$tQ)K+R6wVm2Q?WFFf_EQI_2dN(FAoUP+ zgnF2I1T~k(s1wxF)G6v2>NNE{^#b)G^%C_m)kpPHuTyVOZ&JUc&ZCO*F7+YmLLb2% zeF9tbDfJn3mAXcKL48SmMSVR|LrX;KN7v9yBQ-Qq#pEk!RgZe=?2)I^qz*a! z{qP@#-x}UGym@%}@Z910;R(aJKB-SK^p7FKm2+3#yz<7C*RQ;K<@qb8t~_xi@ALDY z|MIi1KKt^sPd~f-+3!F5&(F?(_Vi~De0JX_i68H^{v$X`{7;@UTx);Ue`tvy5ImJ8 zwNXN&|AQP@kys*?1qI7P6iQX7TBFtJ4MtO#IXoiL5@og79nmpPS8QB-LSj;KN@`lV zJ0mm8lbw^Bmp`tcaJ;vu7!~mHipr|$nh6tY>*^aCCrzHx)ZEhAHnqKD+VmOJ_8mLB zA2|5PlTRFd>e%sk6-!W%?sE6 z_{En$-ng>%lh6LJb@!G%yY9Vj-`)ccQu~iQ{LowP{chQBFa77b-@pGK=x!XfnU+&W zXfe(;zLS)J{W}#3grYLtM^TB@eN<3g^RqO)x22CB-quHzM81LwJ3Fl-sSjm-tF?4~ zNiRJeADBd3h_~U4O|+KvvN2^1&5jo9F6*w!*}JS|)_F5#_ljb;BfjX|)skZEr5c;( z3)HP<)yZYl}y z9beKCZnIfSd*7&Q?tP;q+}6^9yCfqmMT_s8ZxY%pMVlq@_+G|8rLnnpe0VR_vTGN4 zW@EF%*1KufuJB#xhw!w`9X&CUIXcG&I<4lAzub4WFOHYHCcCQvAUraiAPfC8z~7AG8*<6BN|mM@5Ief@X-m>!UO{ zi{#G2f7?fer{EzHywU)2g0etmpedj^pjDvlprCfV`T$N)cEGEFi_ku*;4%SJX>%Wy zoD%*DY;aIPi*SJ^7idac&@zA*0%tt$j@IvhiEh?4rdDPj9km0nD4w&a3cf5 zJ{fRL85G<83S1HWU1}Pwwy6ne3s`r$h0*JjA{Fg$Wo8tJGBc7Hhg}JBX*06i=?1+{ z;;=i}U*25G<_($F7_+=piMcZ?Vr}Vp88NJ)CCHYZn{Eq>&$T5MCWHrRgBNEwotc?V zXNGwDkLy4eL|@%7vES>Rk!o8(bC#zrKgs1XEmC3gXj4D~U4nEAE12eE*jD*2b~l#_PKg@!{mV!o|1oR~nQgvJ61 zp}!^Vl`3iQdmOE`1y1P)qV3YCNV6e^zUV&__xL`4D9Ub+dWg0K&d{bT;PXDTDIfmv z*ZwxyNfYd&c;_S+oTDxTfF>YMLGDlx?)FnLME8I;3SgB1?&PS#QGui3avzm}b0f%( z&nA41!7&n_P3Wx!kn4x~*eR1*lf!?Pgzqf4Cz-pak4neU4a&f^OdQ973P5grF2r#> z#~Sb@GsB~Guu3|C);jE&8Ciw2TkG%?(0R0${KLAn9Au@e8+=T_XAZzBItI6~Av-7P z!bHn{Tp>@5n6UGK1VkzCE%-0J%;kK1Rd7<|#9cq`nqY_!t@^+qbH?1e;3b`jVMB+W zzOmp(`h>4J+@K7h+kJ-}QS^yesVdk*SC>ba>4lM2Uo(Beq>~5v4&s9EMXjEEyOFL2 z(_n7Oht;B)k~xS3ixKr9U#83{eUt~pX}o}Huvxg^CVY4Ed@qENFoSFTRF!a+nkG)B zT^?wrg)wTAS?DZNNRz%xEwqsXPcq|TEi9CpQPG46G*sHf7O=FA{6xvpeX9ow$7wB^ z1n<<6xdp4+bBZ=RyCgzn(T#V`z1N*8H>i{`S(WMS02i z^!oJ5MYYpTZEKW1r-@)5P4uQZR6dNP*3M&&#uui=gwpRyl1e5Meu)vW|BrZw_$f|_ z(-1GWP(DA3RfILFQJ_sF7g7nY1m=0j1rNC}09Mlow23Eh2!<1&1t7x!NEqRdaPnUu z*#B_2l`!aH7<4fVf(k>B9!52T=7H9L?g1SHodETLeg#sr_fv^zP8bJk51u@kJUJXj zcQTC7WEi2zXv<`(9MlAw3tA1@0qOxA2fYk>2c#f=;RBpp2QheZ8u=-n44VK+5{pGd zO~fu0Otc>Ibf*_Eob-7~|1Wnkm-D8t_hxq#$7HqNS%#x?hdw$jBDOpuN*A3L=_=2R zVphu|jT>(44vy5_C1!G`Z}4Wf3%9qI#BAqp&lGOYiW04vb$Ed%Zo-nXSr0ADj+?l& zBE2HnV6R$UpH`Zrx0NrWC(G48Zd0h}J+mH~j~nm6jf?mj%air?s;>I9GTc}}W&kkA z;Jy)E5+A3Epef`1QXgaY(}=!3chF z7DGu(VMLOd6z&F|zn)~8u$iceJ3Y&TZonomdQYtaU<;S@j@~kQ8bWvQE zQl!zY4s9#{%YJ>7Ngp!33CS%|W#YhoPz zO4Xx}9WGXdsP)q1DKGcE(72lp0{^0(ND-?;LiJsL_{Mhw?;QSz?^F7>W8X=P6wEs; zIEs`n{YwBl3#&K)T~l48JT@(JIg>sd>YJ0fC(}1S zl1gV|flQ23Pzpab^+ZSYL`TU>h2WHhon)c8EElYK zNWjU3qmVv$S-^PU^3%OpmgK0=FxZJGg*DzK4axAXPbo6E+?J#n(^{R8A)z78%+mN$ zyn6m$|?lAE3RdOwqB41a<&meM;E{k zki<~Jrza`6!2G&#&zzi`nOmxS^>GbO`cLKv5hJ}>A!T$LMpD^T8|NsPoWAto7`Y=% z93p87o3;Iz_;^a|-3@IIZojM8w?-ZkVGOn_GxOAOq4aOOE0?b+&1%SsSUD%sMANF7 z56;Qp=2|K8e@mX*!>z~hsM}PG$zw8jZ8=*(=UxoNFx){ z$b>X9A&pE(BNNidgfucCjZ8=*6Vk{;|1u$s%v+^Fd@mmXa&f=GXhB+2040JzAe^y+ zxjLzPW>)-!#l`E^Pr3ii1+yPqP!w8c&}hTOp@~IPy$ze1k}VUr&Ivu+Z!egX-gU$& zcbLR-aWf=zRD3*n@|w!pwXJy?$3sgOonBv*JazXpi!3xWw<$L=yR|DXwLZ_jUi8rR z%(_hTs?O1}Vo?32M02KFdjCXvP^jmk09 z1z@uPY!-lxSWqrIumEht4uc6Wq&9ZMT@s@zB!wf;fUdfpOv!04j#g`;m?Q8_^T4-M#Ge+7bPzAkc~cW%lxY;_0=}sqReQv$;F8}H z1X3CgpT9^DGVx)z0BuC;%qz7!J98)Pzp!fN;YB$SIZgTWDV5uD$frw=@oe!Oi7uHv zzINM;ELVAFLG9L#OmkswnM{O08Fk50!)^DQ_fb%%Z1Eaau#DXeDsYV&w80Q332)6q5aND#y>o zP{PH~QCt)n#J!))Sw^iL^#GG_hI#iu%c{yYfgA{&FaR?ra}kv zTt?#@chbZ>ds5B3+=RMuF~HCz@P0Md|Fi)21;_+!g#aq9_mSvzFwcFi&wut6Z01AZ?3p=)v6+&L}O&~BeTp&DfGL!(@J8}Th>>t+??6Eir6bI zuIy$%=Hj#wDFy<0=5;_ypJ1~>8J*7O(5IM930nFom5LQh*r6omJiTwD zIxP4Lxk@4q4gQ17D5uS?R1(-d3?2v-cdS8xpOSFmBn5Sn zY!G^wZ4JHoR4&`Bx_O)#w}t-g7C;2QyOa8weO1&fv|EpM)5t%A@Qt2pcMz9O#=w#w zQ;gwj5FVO+{^q-+;q<3`!+ouM!T*%~O%LKpQN`P}pfOAUV(w|#L2s{Pi%nawq@IXNSi2vDYt8SW=UAC+)KBc0m zc3g1GYB`%((^Q!@tvUsuhg7F0<9sseAu)ER%b&Ouh)_~Cq5|!&zTJ|+keU%<=X669 zEfIk!G%4EQ7kpA119Rlja{NObO2m{khzhq?q?RWet%Yr?@0(QE7PnQaR)*QM?itm| zCF@Rh?)clwi|Xz@ziQ71HS$oIN+Swc=)3XQzHd%X%U}553l|r!{LMqHrK^tk(!%p| zvrP*fah02AfBLSR+Vk-P zH3g|skv7C#(J<|KYWT5@|8?Qm%JH=i4({6c;lnK}b?&BOIyR`h>)y(o3WBTQH(|4n zz+WnW@fR0)YXfSA4+N4}(cjAsqZ|$gW(hjjQX^Zp3oX0_d>l z$bDfE;)z3jM}uOF_cO1*<}0AT-YQXwm63`t9o^x3LK7}NbaNe3Z!U5=i_Lf*v~>pB z*oijkptbST1b-`q@r{6I3AA#6vZ7IXprIfA&{I}43N43r8#qjmI!PSPQq$a8o4-II zMCEeY#`#pIBZiN>oC)-dXXz75AD@>VQ?;b(?#<=f-&}jKkT%z@sf*oox9{(NtY2Fn zyJ7QR#D|g^S67Z-F|)=Pxo_#LV{3|-dwt^giFcGvTedY}!Xoe7x#$l~%|@K?5AjL( z$iMshGA7be5)oi38!4_39CKkN)_&mwDPCb27(xsRVJ3wzlR}tDAN?UjdC3-IPTLvkfC&lwH!iulR(2kA&N`?~?C>G@Z>gUW$p*KY9qDauo zIetx6G|?&la0l=0Q9n3dG-skGEIsnZeE8R#K5)9Gt)=q{q_%$*ljJBY}$N4c)^3a}q`li+= z9>=WI-u%t8Y>JrjMLytD9>n_yCjIXY3UDJ(+Y%ZhA()i#7C7*3@<#IRkvAfZBkwC@ z!t_Ibs(Fon7jtmvLGD#N{>3rCe=hYKe?M*H(Y8?*$4D-qY)3LmHGU)E`e_v2^>b;1 z4bMwM+qrs68Z!Jee}d7d$nevU;inEh73Oq8Gafv{513+4H?RrOzF$7fC4;N=G-?X=3^ZO6hFaI@d zJl1&69W62W!Fr`S)R0-dpnCm#4>aU0I=Dk_h|L@3poThb)4!l-BR9g4iv#-`N1GTR*dxyF(_I@X`1$W<#hWt0$z#@_n z9>|afGNWW4cqR8-H$CpvGp};sp@(k_e}e&+L$Kq^{J$6K(1AX%yo+o=MY zRIqg_*iIE}rwX=H1>32D?Nq^bs$e@+u$?N{P8DpY%5OVWu$`)r6di7jiwDSP67l_R zW?$t0oX_e=RWe##u-TRnkukN(Enhi6fAW_hrE;;#AeM^l6YrYJzQxG^qhi4RAU#CK1qE1|x=|I7eu*BTkCSv$1f7!?%k zFb}mzf>l9GzR56j2PY05Q!J?ui32rw0U&|q3j!YTWr)9sRdUlQVBnDQ*?~tM!4o(e zB!O8(^=%{y3?i%u8pR5s=YfX{6=2Rpb481A@{@2PeNy|y+9&w_ev*F+XGY-+_6m#< z*aW7Knv*1fwz~++2$K*M(rkuAF4mYBw=y!UyZ7i8CP+N=zB$F5to9wJ8D{gbXLp80 z%IG%wJH1OE?_#$ZgMOSVa_Ex7Zr+uUz-~1q>u!83J``lUx&BriG*L7C@)zJ9=+YQK z2*xmQMtS8!)TEY^`J8} zdNW;oC`5PT6=R%Mr2BEMN++riYjk?)jmx~e8N@Ds74L=Z)+2s;+us8LpMmxT>VbU} zDU<=1yp0WqjSctP*l^g`aM;*z*w}E`*l^g`aM;*z*w}E`*l^g`aM;*zyeAwsHXJI+ z`{5YBR>wfAW1!VB(CQdybqusR23j2ht&V|K$3UxNpw%(Z>KJHsj9;r`pw*~Zkir}0 zO5I|lZy${p@6DLDLvrk(iXp2g2@D4Ev#&%=v*HxzfA`6sL#^j|a|%v7Q`BXNgdumb!GOx+nE zbK?LV;^kRzlGrn}8TjouUn&_87B4m&V z86-jmiI71eWRM6MBtiy>kU=73kO&zhLI#O=c%okhiI71eWWYzHd;rST@5$(g9Y`T% zc({5QPRP2ESWq^o0@Mte2U-KV2Xqj00@Mfk6^I+5B6x@8Lnd-toH4oYk)7`|8^82%xzB44@ucy$4gh~vnHmFU-QhOJ9=|O14@-6 z&JkNWH8Z2!?TSmUnpZXF#e3>Hr?kkGNuH#{iHnOomFY3g)T%|b%};Eonp8=2nWo@s zM2CPkDHKw`(ik5Th>>syxPws}lG%`22^o3l6m`j7aUFnjXh8zRxohjHiq zn9miB=UcFvL3sX{IC4x-7MOhab0)M1CHOFGB+@3%j<4k~tLk=idgTiT7N}+&`OW$z z&#W$xEErhGu&(MQ4-_mu*viho*|Yxrhng$yer`ch3O*gwIW^TAT9FZ8tp+7-LLW8% zX4aBW5)PQ{fX4O%lWM^WbCHA=u?C4SxR}hb;Q-1Y|07e0l~JMef5~D@4-R=wiVvB! zH!16c`1l%|hzgDTaW2|{cv<=;+L4I)#{Wu|W8ANmXry(NMhcTf13^*(xg&uOl7gW% zWC)}msj&adC7huUO5z~Wdc#Qjg$sf12-O|hargaU7EGXJ8JZ5(%jwgyXj4L%MfAK_ z!UU^>=?A1P)BQs)o_vcHGg5`rmvTaUC`@-VSQ)D|7_Iqc_6KzY`E1U$T64Ki2&QU7 zojRQ}^v1IU+gO1_iAern4#dx6>Of=4SAp8Sz``)n{V=}!65><2?(2lJ)U+T{@iWpw za2Uk-5LzN7@ge=4@61WPMoLpb3VM-TuX@ubr`Mg(8702UvS44mIeLH@VvZ=4Ltkh$ z^bbna(4w0+j0$F%S}}AQJL^EEYte@r=z}hRtuZmPmb6eiN`!%sfRwb5_@l|Z<>%Tu z8ehyW$_L7Q+n)+E%l;Cq6o*8r={w~%(?iU-p|Zhs*7iBwBx5Z4p0^KajWom3jPI&6yjW-c=dTQEIz+7vg8Je2i-wOe%f$Y9 zJ3l$Ej*s+7n6RkQnjoX+S45=C#HZ|$Kjzr21ap5y`{K|(cRx2`s*J^II27}skDCjnx z_almD{BgXSk77_nl}NdoDpSx!&)uvx$<8UXQl;@tnMrpKa_n_FB|Y7kpifNjJ*Fg! zxP~A1eZg!SZidTMkg-v`9ne9(E{3F-ZK|OJ<%tz5aBYI9n|=&_JqVgLrY$7jXCP!P zDcN!H)HhKP!3$^UO!8O6$90BpLsT>o8XBB7{4M*mh=p<`U{#v%Bw@-+U=2hd!x!!d zBs66BJ(w~8-LH_Shfm(k;Jg{W*9?zlhRZg?Wt-u$&2ZUfxNI|Awizzl43}+&%QpL6 zwizzl43~|G27s!AJdXsI4n!Lcf3)G?0<&0L$Oct_nnCkGYe3l42hoND(S`%vaUj}o zaKWXGleE9S!w(|RoG(J;Wmk&yIyP;pBTN(B*gnUTKeN=C)VSi_qpjZc`9trgbxf*^ zNH8Sm^Ow%7%dtkA-y1)#GB%}c+mzN*2RF96_2!$;jazh}g`O&AU1c*?Y$^RK;cXpw zdtLk{c$aL^d}ma-O-^k8j^ zv+lVw&CcfO^Rn)~&tBNFcvD&ZmUx9M%tHSmb!J;#q}92=lQFd>Kh7{k{N_-`xXv=y zt1mVjJ#hE5tdc^n+03rYUvPhu@1I#oiPfFU*XOT><0o1&4!oWP9H&rM{G1lNNPyF$ ztHWd<_~*=W#dzM&m*tWfIAorh5F7_GHnO57W(35jX&G)W!4o#S)1y!c$!PEB%x&J$ zmNH@2*{<35xU(f1xiUP#>n>eCH8Uc+J}ap#E6x_K)F~5R%Be}xii_ogEsD)rUYxrA{l*4p9^%rp3=(mJ|0}OC`jLi^gLtLRp z1jA(nX8I_tAB{hYp7*2BsO8Xz>9ct9&u5WP+9a-m@SaSJCBq>`z?~0gITJ#rwlm*5 z!nDrTSqnXz@8#iLwLYQr%uBwU)ERBHkv8XotlEt&sZ*lO?|TF=ygP6HzA1D_W@5*IzLwQ@a{SH*uDgKicq#`9C)f~S=}>^zW)gjv`3kDsZ-nJg zZ8=n14%L=JwdGK4IaFH?)s{oG4ajIbFj)c8?I+`R_R z!&*LA5+}Y&@Z0AESSE~L^Oh+AmMH<2DFK!#0hTENmMH<2DFK!#0hTENmMH<2iA(}c zfMrU+d;3wwFjG!GMj~YZi4NTKV|fJd;JSs0AqIt?4#{?9-FNdmy>eA*bzYLw8mdtx zx@XK;GQMfo^bA{J+sZxl6P8vueE(6npdmN(aQ|#;s3V(=C|c4|q?7CA+xO@q9g#Y< zC$l=;n7i;`$Ha$ruW3q8ENLjhbeeK)T24{4#%0wL`!ar5%DgB31x(&lG+X3Hy^b(m zN5VdSK${eH2QVmL23b95#ac0ww_Egd80*1H%seC{RBQ!WG@q?=b;41Nhs|4UG0k}#4t`dN&1mG$GxJm%75`e1&;3@&Q z$XdV>fU5+r=Rlvz0uVIKNi3zZLCog@&}E{jF$!E85?R_P3(_t!RHM+TV)y zx1#;6{`R+`{jF#c1f~>|c?kYVLjDp0nLv_-)d_r|l1$Sul89J^5;h4sggG35IGy2y zu=&CS!8^mI(MEf$-58e^SG4ZT;--5$Jq_DWwM3UYg5+9*vm-yZvnDZf&Vw`WsHe3u zMytImDA;#bRzr@ZWnxxCc4QN62$p3{i*Hyn(Yba>(c%dS%;ogDlKlL_nD~;4$+_hl zXXZo~wP)9MRoSr;Ce9R96lacbVxYXDdvQ@lo;rdxm~(vZrA(Nf*4&y{)!}aK@L9}B zx*%C(YN5TN#*sS_Sg6B5|J(2b;nXg_RT63n0jo5|0|aUc&;|$slZN>CP7e|5{UX*w z#CnKW4-xAjVm(BxhluqMu^uAUL&SQBm`p&@L&SPc#LQ(fIRNnoNw2VSh7``p)Lc$; zq-@=D&o$P**|~fJ!`3`k!?5FulBTszjPxSNn6zr`!F{>}L-Hz4diwM@HUK)RG`Qke)~!>dgr<`>%P@H5>3WL8&)hN8cm4~ z9sB)FIr}|bU`}%AbdDsmIoYAtIWS$F8J_3cPrrlr>A-+3{`U!<6N)G_KwveenOHv! z(@E;h#NmEPB4ORf#WWyu{u&n^L6~MLv*j51B3Se6SY%73m1+cB~V_N}iD>&Wc zm&0-%j~_$>K(jn!`*_cGSyIjXVn@13BUUPqX0ac8EDn>vRBcO^AXnzD$F@jUYcvK|G zGGIL>6cc3}t&&+I8hML)R;+8uS5`kaYwpaN*XAuVXoV$_Kofi+A*xER2YFy$FAeT8t1w;(^m>?IOE{(M6QeDOHoJB_!^ zL8jlVTr(;8j(Jt9CnYa#Y1}nCyRQ4SJNV<-JL|UnV%qM#wdCJ>yK@#DnZ4=S(=&4x zJv?jUwWnvH*9;ZuJBhiiBFHWwFw;x0^#NW9rH{Y`0WAUREChvIqC@nJ%$O!a9Rgni zLmeJmEC)4#=7Ls(c7S?7$3ZWH-T?_wlYga4Kk%ZX?070alj!GLPE9IzoZgO3;@R6W z_{d`|`D)}ii?aPGeD#L-Ecy)sN96Ad{rS7^q$TqBCIA`Z$yDpQE-A$T*^X5m16z+ z8Vh}m_3LXaWFE`?pN)SjK+T|epf#X-KnFo5Kz*QJfw=KXJ{4p#v7}!J^tiO}wz86B zsnyIdOrE2zb!NtGm8I17Nfi-EdVgifcQPi74OJ@{`op}A;^d92DczqBLvjg*EM-Z2=Zh|LhE!S+X3F`G*1eY_<;-kOp)v9(=K=qrg3V=ajbYbha@> zZU{GqCFa>uvg4e&trcaPX5^M;l_-=EjtEP7vD2L&>+m#Jj$b|1Gmb11glwh{f5W^a zE`SE#c2B}Ve@$zP>;h#7}E=K1Q<=N#QbunqgV`NVUii+L1^Ht9;*&6N_0oCC(fhsgucq z#4)LN7S34uxNv@}JR9fGYcl(ra>6Q@Iou<;LWI>Y?(iZT%nE^li z0sB3?@WX!I2!11gTOmCPTnJb5gI)%` z0}}j+6p=pW7NhtQhR97=RmBa)a+#zbqN z;Fq-iR|~kvg#CVKgDx6LRQlA-b&Tq!JR*`tI!o8zz3uRQ2vL}=JU?m>mt6xt#*WvH z>3-nC|9QN&=02T??U6|txk*Fk$|BU=KG6a8dxL6dMNCz6bfuHo9jd>HN*VV5qs0B} z-+|Fh|57ev3dt6NYRf2#V(oOl9A2x{>tOCv>2#{0rH&$-wb;S)!_J%uwS}s!>Y)ZG;qY%Dqvs)` zh%sZg0g;TsY#@{rSP__ALRRo#b`-}7y>LcKUc^R`>3rMFdFA-+u?2G)EX4{X4nRcT}#E(vD#_!RBt&WIr z$dbkg+JH(e3bOoa3>eisnj8OtllK?D9?8yBR8_Jpo7A#(N?H&T6|8X;rI=~EJ1;DA zyv1QD9;Xd9GBhJfFP&3Nc8a9m&M2CvCQ6I(trw`k4sWoZ2=-$^=CJS61eBQ=D8REe&s9jA8f5)b_Y ze^3W98UDt1jWOXj2AGJC%taSwLy;30t;wbYLJM0^D>0gK33 z^dANjJK<#z%PA}hMbZL(aXV_Duq&)!p-74Ny zbEZv+=09|L$p@x$a#``xx6o;O1^!8qwfS`Nt)a= zH6xR3B{y_U^!b=&ZD{MRVXeq1x{fi#Y!uC)aU>w|SD?n!1mcO!k0&<2A3IDWb1^g7 z8w~q2{N#pUq?nILgXOmbW3deq*$M3L4Lhc1Ot|mTRy*1KE2-hm)C`$g8DdEo7yrQc zw!-*OLy*hXIDLMWjcfsSXvKp2TX(jn1_zZaduaMyA3idbeNh|vCwXC7zC1`{GD&X^ ziK6V`s(eS5)4)Efjbx5)eO%8{l9E+V^7^mBRE@3T zKWM^mlSDosI}==8D-@4|Yw%u0Wx^tqyfvQi`S zBbi?WF$!a(`evTek&_TEiGGs#gbwOBwyw-s)RvhT5~2)Gjn*a9E-m%_uwt01UJx&l zRw}Un+|uBvl;UJM8O&s`#?Fm)sOawGY2Bl&V8`En!lb|d+6Bl&Wp zNp2)xZa!H>?B?=dP8e}u9wTS3B~qi*#YJ{5sSB3M!)>}H%uNQPX^AcJP+L#pyxg2Q z35QyGqU^TFgKY;B=jG&dCLU@%7-ie)D5y_KX&e_FJ+3h&rM|$yJSKc)w^x)^hB^dydBa=SjpC=UyXlm` zoc>~Bj*3T3K(mnxwox%@z+m-J#o!3zH?j;`K^B}dT&_yK;&KZzATI^*NQ!_V1sP6E zAndgP;7I{IDS#&h@T35q6u^@Lcv1jQiatpJJd$XT0eKr$%!wf$Pli4Dj^x4&^gU1b z1`!Rkn|K|4hz?45A7MLc134qKtsEjIGN>OS`byj4_oK)F6XKV@s{fO-HU9S2Ve0a#7rjxiQJ^8Qo27yHkdah9^DlB^;{NQ6Bi(p?%Cm!BFNpIX?E z-Ll(dZ!YkzYRxRj8aj|tl$~ygoRXPV;z^BgV5p3tIz+w9Q{sK7gt*|$$Rb>Xm7JoJ zy;i~iM-`3^GM88IyL|R;VZ^t6rVBOJIHNJvqS07ljm9{uhMud5!j(93g&d$`=uE6%-u*;#^OJj)HzdtE_0`tqC%Tu{C(<8F#N&%9OV*v3 z-Fb3tadEa+5`uzF(xf%j6V^5)ghhsZ+d1$gevjuq>30Mm`weH}MOiu&e@Zo9xYu z(3uy42||Ef;Z27LrzQx&1R3|;8gKRm(jY;xxRu;l+)DgJ?7&gU%DJQWw(qLCQb~5D3Jd8=LW5i*}sTon;hL|aP z7l`TDRC{W)MWqZCsk7FUB$lLL!>g3x_FIVxwjvziL?tzaX8rgW6Fmlo9|y2Q0fYI;E{|9q1U;a~8)6hG8b z0JRi9)KUPR6hMtc@%YGM^po5?jpgz#AKm=-4cwPnvHS%O^01GdbjnDnq z)GU*#;^3VL&=va1e);K(`V_ zzg6iw`-uUVo!HQ|d$iJTz5et}`uan3)ahdj7N`x1FAqei-wg^g*RAkONYQH&$}_ey z7yqvc-+AWiE51kA4R@~V*b*j>()ykYqmvcNE`4mSGbTG4L+CWMRP;^N2ylG(Ex z6Dz#=Q7d8wpdY!=GP3az4;H?? zNnCr$OkEOn^dl<3f^bd~`F$5Tcfgr@q54GJGq(xb$Oe5VTM3hZM*6|hKO|RYMs(+7 zr%s%mkzMbx2j!|15i*g|oM5wO#^}nX$lDq-6Vu1(l#%Gqcx7fqlVr9zsUUiHlDgEB z-(F}7ODj(?NzmU2tsy4WoR-$Yj4QyO*+_^&&ob&V!b#t-eM&brbR%>0iCY_)GbmIN z5MP1)-0A?d(ajwFhcZ$(=P9K0ro`q)8pLY+IwBLwqhtd;(jH;rB?|rABII%0P?OWe z&!|ELD<5@QdTJvxrM_(Ixb{;U=4y;(JL;c&#Bnbw@iHK(2pMRg&#d^dwT0#6Ivf$Q4De5o%`w6=(EgM zcqg%G*anOi}J*pOtGFQOIDnbsgKGgpR&16_?Ca3(f2sLnoBcBW`+qX zCm@r6nZQo704XLRL7!Y6_Xt+;A*)oP)R}d$3FSq(3$0bfw!HdOXHmFO_D@-mEY{+P z4BFG6E=-Qjap~2nOj4u$0(!qr(t+xEDfl*mg)#ZEFiQbU9DuFzn_wlxPf}x2=_7lr zqVI04N6>JO8+-QKzIh-kcx{MMt`b?lpEq%>+_#dwO23deH7H1u_1e&ucKmWLo6r0f zv49r&+lb8%pn8Cq7qErce4?m7-}(h&u5O)cspYuJCyoaCgWPtnJ$3S$io6c5BeiL5 zaBGXVFugQEH(q=qrgTPr!`Alnn9`Z~^*9dQ*txQLva`4&yLuA(vot3!x*SU||Ag<~~X+0NFHG7~l?MXigHOkN#T{ zfu&!oEmCfZ=LAKf9{4bLE&tx1X4qRYA)EYN6U?9mYAnK)e#A`v@5qGa zR2Y;r;!F5_L8T6|8zb4Pmmk96mQdafGcg(Da*KxUkTFWdWc>nz?>%g(BBJkKeRHcm zC9;e?qD!-t-&je|s0e**QLkj5khT5%qaa&~6(6-S?eNCHa z@{wJ4E`X0y!N(w^krh<8pNnI*Z5UHRxn@jYZzzcI3xSXu|lmQ z68t37TgfI{k=!10eN-8El?^`T33rjD92iF7)|j%l`eCwZK3SnQ$_;aMI^u`%mo#ow zS^9wh$DW$LILcidJ;3{D$t@l_Wt<_%pcW~N36TeGJ~KwoGX*AA&TdSqDK4-*4d=~B zL$gQw?u@ul1uc>-n4dqI)4=Kj;PE=~qa0QzVQ%z4{ahY{RiSVf0Pp_^t9-;i8ln8G z?m{jyFe5K11XlY|L*&n1!Ds`iG{tj~yoZa&$owD3ice3=kTaC|bA~c_=rZICWr+F9 zfRQrf3}wg}%8)aZA!jH<&QOM&p$xq$L(WjfRkoU;1!TezF>`%X3$&p1-)lk4zX(>4 zw33uybg<%=HVc76QN$rXp(r~8V!yfaCu16AM%L(vX1ofk*G2NsG!oLVihr$0vY(1} z64OV=I;k;OyT}HSVCUv6Ueh3*;XnEwVpd|j#|4y+jQ0qm;enF3kRWiO3)#mPe~5`p z*plJI1d0Wb@g8wtUKRe#jFg{hPk4pt^tX=yF)M8~O*6AgmeePvR5ne_4T@eF#HLj= zmZg}J@@$^Qd{>A;?i;>+1H|7)X1GkQin-qU<&F87S~+q)j1d zk|t?hUQ5%o>1(qzec7Aj1uVbsnR{g!3~fKZ_MadA4ENr-qnWvL&YU^t%sFQ?J}O8g zG#~L`&ns!ks~o1@ZlsJx#&L?AM^ghhm5L!r1x~3(fb_}{AOa2$0oc#0Iw}XsIZ)04 zBH#cKaDWInKm;5h0uB%X2Z(?JM8JVgIzR**TyfBd`fy~UYHyei%?kFgkU07dWBX`Z z@CrfmNMQ*5B3U7ke~2p15_2e=AL0%R`k&lff8|JeUBkleP5%9XxXW>ptBrH+Ik)8s zLH6RbNPIJwhLjIyI0<)IH*md<<9e2c>%jTT(4{|I?N@YH0s|9CAEH7{-BmW59QD5sD56a#EC$8@tBV4SL+#|e4uY5)}}3-kFw*m zPYuIHaLhsJN#&4KrG*Ia24YY`H3=F|diq3M!|{f!<~a|o2KP~e3#L0MF1!}a55#KX z<825l`1UOmmYwx~c8@>0{c(ANZ!Q81zE&+v5BDFbL72gp_KufA#eIk{xPu296z@1d zkp}%CO9n1bu))B1D~&p$6@>%`K@o1}`8>uGA199npXV-{KPU{(r}5+EF@D4IseUzI zxhS8;Rjq%3@-gU(*ze>r!~!<*7z8B4(GF-R(vV!DQJ^5@5Bf78YJ;c`6*3WdH&l?z z{2PVRx&AZ$C2hif{~Pm!0^xe;JO5Gtf6Nf(_-~&f^a@wa@E;MTfp;nxyh(Xp`3*Sr zLTEp}1Vm}4-j2k%;}KDiG^@EFF$r=UC$Zxi!R&kyr(HrX!3zWgd*@Kdynu)nCqngR-tPC`w3^bw)i(DD_ z#xiVblwnh&3|k^)*b*tjmPi@4M9Q!wQid&&GE|0LjdyVK0a7po7I&|PNfP;*angc) zT{1s`fGN-+OVBk!E$)QS393S?W*{(D_mNSHF~;l`=P=opJ>_D>qe zoWCVETYTAb?F0&zB|YFs8>lQ;(=t3_mdCv_C0+>a{CGEyn^oam77=4qKJWa!|B3Fq zDy3`k3lTyqXUa_#7q(|)QWPzk%RB}R$I(&^N4H%ze^3~nPdLiU14oDF6E3Rt3~2f5 zK%>s*k3I1ZKQ`KOVyfcKI+LCsuT|2$vOB$h< z1L)-ddO3hz4xpC<=;Z)G>NTHLct;oEP?FzF-Q1qxZfb9G=hlv`&8_a+Jz?su!h%psR8*R)wjiguC^^5O zy&=DF%;YhJv98g@)r-5z4U5RDb;pvdkRMrQUVlV+$UCvu-7vewTU45n?#|Awno>7u z=d7YeZ+%!qa#}K}XbWocvx-|vtEV)U*S3{fD+*FZt-P)4!mZ@_8ll+7O+UJY&i?}z z@E8}$QQ$@c$Bj_}jB>U7H-_b}7O-w;`Hv`vhRVMtqz~oetka?Vw}<7wtn44kUob5H ze&xNP{I>)jIwUdM;OEK>vJSxMVpogv0$4eMR@M_oQ$NhiR0}j2WP&oO1V45SI}=!! z4DSMzzk%-MV1PD4BM-yl&kX?atkonPv zMu4+|_rZWqZ2=dNiNbBv7qZ%J!$-E^BipEUBgUu=BhiL_w_zmOFcNJ{p%>e6a|r1u z($h$1knn=Ow+-Lh#=GG~3zN`-8`rD2re9T^jdZO?Y<1XGL74?}Mbi3Tw3|v{q||Lx zT0(r>7l>~S$TKVFj?MAy{L5p)`b7n;@V`$rA(RC7zwf&%(>8U^g2Eg2)$aSt1F|9t zw^w%66vRbCX+HVU`HR-aRX*h3x%S?9uJLunGsYH&3g;@X9_5X2TtKXioaYt%dRZ{ne986V|M4-qKU8q-G^W=^wXe+oL0V?QOHWI%f{Nt2is$ zJuQtC_gnbN)w#Mw?vtI?~+=xgwBjk(YE>VqMeDs2=2JBolEMVFN}RNs%0MhlQNR5Qej zM2&-p;=hNu;R7Wsxd}i5Z}|JkABD#Vsn0 zW^iBB@~<71znZ-_l;6*3v|9ePVfoi{TCC@%q*BuW9)O$Y0CrSMwK8KKP8P!LOv(mFvNgHgb=6;z*+dE4qzP#zr`F z3JNI!ED9+Lb;u$|tCQdt)w>hS2Kd4#TjdlzfUgJe^zN!Hxn<|6qck%9$c5nS%B$D5S@ca4=cs zR+ePcEWCmfdbeiJ_Blfmru?Ysc(N{LdHc+!9cQoY*wtIwxaoLb_nie|YwL6Nx}{U9 zO`#c;U1ej}bmXR0O_Z~hP$edGX1p`Xm=Yf2Gu0MtEDH@YMNI7c;>SPsfAQkNvW16c zEqY;J*HzPZywtes!p@>a$5!XH*JM=o?P(viV00#j51=SLr|iHQ+RpLfZ2?vbfE)K~ zRgNLQL&KMEE}Op^G%;BIwxRN`U6fDttM$BnQT|Os`3oo?YxfHF6P)L`8F#UOj0^in zFfwFLt~Lq9T?}W|oS?Z3VL!-BM#RY$U|+d)h2DO#+A8DXGqE$Slb$nOs22{!Wq7Rd znaL(gh9{}8V#@Hxf=clZ*9r%%o{TuM|4J@wZ?z37p64E^94>CdtgEMqq88c0T> z@FQf6!eykt;{m9Z2D2KEU)UA_esV`PqGwL5j1-f%j*J7HSm>Ns=$u$3omeHE zSS6iUU!7QAomgL;SYMr3Unz{Z6YDEQ_C-^u4>Ll=_Z;AR4n{Qx_?`oN&jG&Y0N-WHt9N>En@I43ko&$W(3E+DU@EwX?EU+G}r_ddyQS>QTFP|tQ1)W z{9ryre1d-}78%!}aXc9wcj5o9SY&WyzBm>c6qV_hcrs`F?vbe%#UdNKAva&jOc7bZ z)$nDu5BFu($6p+ctitQxmY4x=W(r64oi{Jw%{&AHf{hA;1snzftu?|<`27rvr9Xn_ z4~7;2@rIPi1Bj^cLa@#Vu`pf8($i_5jZ!x%Pj^<{`*d(YgmMGhg@gLw6BFcahp1ZOc;!Bp)qT7zzEj zgxkhH-1Jb=kETD|dAImZvavzDX5ghUbM3~_14i*NX!(HWa|XZEf1w=1UZqD!4sdxR zG(y_22Zt;en+!CGcKS4?Zm}TT|XM(HzqEA^17BGeg7Z(H&6f3e{X+A@V>t}qq(<65C-mA@bJcl zo+tfxEPQC=sH>j{->j=5nNhO>r(>^50 z(zvODX(p~dq-LbaNb``^AZlk9(F*{0NT$md<=5)w zkIA%@PT&39=5>pCRJBx7Ok|#?d+xGYNOg^`Z*5=Sp53+o`GpH_Os_dPFuHwHSMH4N z@f)YO&G}=bmWsJ;rD6M@o}UquStUzpHB(BmTSrwCWP}?p6698{ShB97_xhG20}oE= zy=vOr3#-TPes1}S?X5rf**f>6`Yb6df9f^u(M9ET_V^q-xlMwuQY`b|bG<(daG?Jd zu**#O6cfOu&>D%I1n~B+UnBB-RVVl%@>QMS0OLPUt7)Lt}q&k!}(!eJxp@|;9rug3f zPY&9kNx&jH4w)YphO#KDS-oFYZweVc(Iq#mHKQXnq({BoZg3LDwDN zD7Pi#hl{Cxa5#`hiFN*7=;`&T)x>;VY&uE+{@3xnZbA=~G#KsiWShCCP z-tN%|$0)?e&x$66tWL=}8X zI7WF7^`&BMBX7}wEg5OYVM7P)IQDQ!y1B$9(?_46hI`UIWAn9SWsfek*-A%eXSMij zbG&Ys&*yS`mGqnjPg0VnAt$?`AStP!Av>?MG|yEE+iT|b-!H7hcO-EuGm@w|J_Ws` zPT~V~T!z+M5{bkINwN?3%}A4x<{_;?+KzMx=_u0ENN12V5^urM2<;@<9gv2EP?f91 zEZm8Jv|mC;xD=f-wV<^lDZkb^Io6dCpJj_pHXGjwtF^VirwoH8} zw#(Uk`C;*}vJDnoPK;h0Ml^&Ih&W7K;vvXKAO!bn01P7Hikrr5l3VQTYc_wnDb2F`zoy z$c>mOK`TL&06b;DQzb5uq%j;aPPKDOE^ekOzXLPXmOEjlDjXVQ5mxiWpGMiZ$*Rc+ zlT~iHYK{Z$2!me@ek~t_?W&#K80bOJtzGNV@SPW$PpSq9dI27z{UZvaR6)_02>Fu#sRQ#0Bl?UuyFt^MjqlO)tg9P#zjLgm3EQ} zc;pleG;CgBE-V$v2SdcP#Epv{TS2NOn{>S3`kprpX?oDbrW$Bg5 z$*-8s`_yu$r0<01ly5*Z$d;Ig5* zh|{bwA-r5goWX4$g=JKCfiYOO^81VHF0D;R-FiK*TkwA>$n39|)a|=`-G92Y>c3vG zX2N%jk9dxcPa(82>Ie<_;Ev!RHKVk@H*A)Fax@?M=Z81v;x8CB?jk!Vy)Qn&$Gs3U zRvq~SKKkTKd_@R2FF$y~x=Tk-*mY^nl|gk$KZn6k9DElrJkMcx`F>sjnpf!O^Otr? z_`#()R|NZ&dr5TUHvjF?_sUN|b%)}*XuJMFwjjs_Xv9dadq>pv(xnCuo3^}^e6asE6h%n+KLD9GW7 z7JtKq?~V8;>4ekt?e+Nf^Z52Mc0XYf(TRV@w`)Qb=Xqh%4G~*4c~yO{N!-176evi5 z%AqDe6-wa)@-ZS5`^k%|56Oc2Qe4X}KT4oDB%XpogJIMNHDV^vx?D+SkvPZmGUJw} zVA$G(1v)7|r)FQXT^+v(7}Vy}47-S_hek={1QWnh|{@dzVP^?7M{b`LMiqTkE(Ty%iO`JI1wc>n#^2 z2A;-kpHopWXFJKeE}YGlhq**P!4-%gs=;bR)TeZkX48jlLHQ`dr)C7$usRY)$+M4a zFBLGAs#mcKLrX!h0;UVZS-@-c?>>(>>0A^q4X7bXF?O(z`DqC6N>_W#lE6cfD=mf> z*Ir)X8NHo0_?doCxtD)G?VC(xi`iBo^OA80&esC^?1C$d14r{&RALsDI0c7g0dfM_ zXT#|XBNDLapvlPv@B|3p2>}5-0jp91*zp7i;0X}G6Ci*mKmbpG0Gi%_W}L8sAgh8y8wnRfT0UO>H??I1x}?4oJtosl`e29UEox@ zz^QbBQ|SVy(iPxTy1=Qx_YgG~(ocEKb(kc5m?UFyU4d&CuA7L5xrC#?^o%qv&~U!( zAC-h9FO)rjjUer0++oTe@!g8q8|q4Dj&gcuY-++aV|%Ql(3;g;oN9IyCTBL6q>5{d z$(D`hcN>z;n-#Hq_Qtx>8Cvlf4bE+9@e-}LH&x0mA70~7k*1Oqb2@5l@}|mbdv0Ig z%O1D1sppP`rPC9Wfv_Z2~v;HwisJbIKvSb%6Vg(Ln5nKQV3Q&5;W4Z{{fVaK41OWM zfO%Li6b0(j`1Ii13z8i214-u#UkY%ZoO{p*;3Wn0MzAc}n#TEVm`>rCPT`yo(JOK} zaLL);X=lc?Gh^DBG40Hlc4kaFGp3yx9W!IvnK4t~n1lK# zWDHgj-0@QgXxims+U4R!F6Iu!G|0uY%f+;jxNQVG$8Vb5e$POwqUFM z7tg(Awl69vy(PmNWqtL(Twa$P($KrSAMZV)DXmiu}?nzXJ17Eq;Gh*m2R=dL*kD(&7Swa?y%SwuIio1e?ACV}~Pdcs+ zB53@?G9CmDl9^9JxHWi8$KsxbH&ai(f9XEy#SmE+9`bBxlxc4B!hF-~rsOEAVN-rz z^E^|O^2hKam1`@GM96JPmhkv+p(sK(@R-ow?0+~ZN$6BCN#~7yl_lNVJ9>|AX~}6_P+RPGCnn2u(%Ut0t!q2-3Z`tl_2Jp;&+Z*xx8~lt zal&SUl$9(z8a-z1eaoipnpIH0<@EY->!y}R_$MS=BAupa^W$-yt8eP;e(=D`_T1JT z&o1l#*&T}#9_voBLD?#@y1}pHWQBqbwLrJ6jg#i)5gf_jcH${Q2Kd$!3z-J$NFnxA z7jZtFNkRTEA1b0AbyQ5iA@Wd+>0FHITnzG14DwJ6@=y%&Pz>@=4DwJ6@=y%&Pz>@= z4DwJMAP>bL55<5gP*l~&kSwelvYsG`m@pI^>Ck}#q*EAXO97xj92f4+95b%7VD!rN zJXuaya_{eUwjffqC`QcMe`4Out!YXqJScjnXO8k^ha00pEal7RblK$i{Lv+2H%u=# ziiq}DmXu?SC|z`CPjZd@75~FuZFf)E+!mD{z2cRdCv~)^RasKY5^vmRPB4c>pWo?Q zdVjxbVr^#i;#(%0k|X9V!w&JA&`-aBc`t!kFA2bDge`m!_&S=Sfy!LF+vNa ztyRHYXH8mBGcdo@EjRVBOKiJ=UKog8aEf5(R6*Gt_3YWl&iIv=A3b|IN;!1ke}AN# zLFoXG?RQMEV$akJiRemw&=%04CRL{w+Va)`e?aB2O%^;bFI3=;(67iH(HEW-9@P)r zBh^KpKOQ268^t^Q_HY4vUjr4z0~NQ`MI;*~sMBNPpy0-b{8*gHV{lwfFNC-orVIDN zyaVN0L6;Wk9)<2R4}DGqKf>4fAYe|Bw1tUB6NvUl5;<_}Ad*Ak5pWXmLlJ&oJ;qX8 zw(r;@327t&jgL)`dqd=q=rHlBkd&Au;%$jGK?hMXF2aA6tS%`l1Q79^{Ne&h&;%-;8ww zH`yyoy-CrIykdJsU7;0xsW{PDUuY%H(_TTZoVmq*d+FHh?6IZxtg-X!I`;Ne*~{p; z49|V^TzMd+q%kwIu{hOU*;$-Xo)JUW%(9G_)MCmnNuf1kaD)FI>8x@Ldd;B|wKWtD zQaVlN&+&=QfrhuJxB0sNzsG1d2%?j{X0URr+niW*d3aVxWRkMPsSwYpT zplVi7H7lqZ9nrv<9xJFC9rQp{4g84~-w1(oxP*-ZKL8&x_&k?=dS`l_HAYFvnZCsO zZTy6Jo0@D5NoL6qoow;8SLK=HQO8e2m?lTZELnB_`?&{Zxx!7YVc|LJmoL>?OADMvW7evw;+|R4T`6S+PD51on)>27Gp9?| z(n6=vkhxlWhbMyx?@D@RT_sHpHzybu733qXaYSrlSYJ^gj8Od#hsVYn7rR~dEPHrt zLfCwsOZWoo{^#UWc@z5IjIW1B0j93{&8nL``6!E^GbEvsn;q?{V7_DiL}C7r9-OR& zY0FQCYc%nkcEk~Yvp)ZWyEXlt5kA?sY2W9O{x{bMdrbb4TQ=R||I{S3t?^Hkc765L zb+24^;lg#V(AZC7ZLkg72Me|Y^ak;N-0HqgJbHk-1!5r-Bq*&Eu3wDR3uGqnm{b%g z#wGe)ICvw`Z5Hl|jS?aUa;haI>cV-+BCK0)N(%d>Aws7_7~eF;Mc};p^}+_fVLRIF zLz_RB58zAHHsjGI(L>rU1${vOV`%yGIgzlmIJx$<#3x8gE}V~&l%ReQ-Z;2Zj#s|Kc$&d&(09`ABw4<|qJuN6i1Etr=&Oqmc~~L~ zN%R2pomRISg>4&!?f!KezZA?k{8xzx72^FLMH`gJ5b;^5FerN02@R?Tk*5pE_t6VI=j4V*er{2QZB&x`ArIJz*amSVq)61z$oIIrd?W zADmo(ssneh01>MSqn#7$9$Dz$G?!dEcJ^fHZ`K<}ufK0$bY^CHc$5?yWlS_pT;Ej~ zs*~QokSfjQhn7tVQ_?4t&bWO^m89sEX<>T7(XwQ03GW%cO^#L`M_=h2>ml2s;Qq2U zK*2-Vw2UCXuCkr#9z9Ji`xVY+Be{e=pUTAI8jE2tV`|2Oj8iZK8UXdAHu8E=89>@T z#vTkp=J12s*3RQDEmvoS9MBu;m)zRjyt`!0qYoW+&B|T1KT`K;B#vo&9?mNGVtc!< z^Wd_&@b9N74%u+icHb8My`_JKcl{k~`Z*PT#{~|OTOcrlvF2?SR?zdPuVlj4DKY-bU z*8%`)B=7-C-M~>^TakF?I%9n3d}G+w(4??yzd5Eegecviq1`(DoA}*zsOtmN6~gO6 zI83xab?H%;$m_~1N)_OtE_{CfPYIHvzeaqNQDdARP^e%%4^~zy$kiF z@*1%Yq0f9xxI|+-d~g4^Da8#L#4{0(l+jR}GBvQbuiHRjz7yT`nHjaDB(BZKEi21a z_x5kog@`Zd-T+TP`{Kk0sDTA(OF()dB!Poc8czkGZA4=##+vV zhd*hK=WvH~v`P39wvgd`4d6bp{7d*5C?J#+PX3)Jqu!G12uq2toT0oBX)vUe%^V#U zE;In|K#j#4KQ-OoH7m06Z!A^+237m=t3Ur);5wLyg=7#ABdY?!D*A`t>7Vk$5-MZ@ z-oK+CMC7P2^_BMjfbCZ@Rq!~yqqz0t{I zaNQ)n&#s3b?>PBC2VannvTpe;Hb?2hH5Vz0bt{c{UdFmbFXEjQ4xX1kX8qFRtXp>& z@0KDx!{*5IS-)}u*CTlMCJU2m*aoGB9gsg^8}-xJR{6fclky(6PTt5&_!hhP6kCMv z`2v0TFY%qhyTwvAPWqY^%2seFb6Ay}!o1R*tWuoCYNa0yJ}+mmHsND7Tln4JeCY)? zLHHe;sj|{#m=ds(6>QU#1%5mljnE+T$Vq3&!;AP!lBJy(-H#@A%V2K#_ zI>k8nrZSZsl>dk0%#Y=@tX2Lis}esL+<>xAA<rSX9YcB6Lui^pHM685R|lXG3kFrwum4Ov8J|dgHCe@51uKI>UB{eII@z!Vu9PSsb}J@^s{v zrsJm1qfAlDqJACak6sr2M$EF9)8+-{H)8LJeJidZZimHW>9?G=d>@|`KPJ9E{=WFr z@qb9zo7j-}UD6}gmDY2~7gCm`+?Se_dVT5-ZEdzU>~qr`X+KFXb?6*7JFU*y&QCMi zGH%cKb>^7NIhp6OO!%9d_3P}-IcYh!=bX&FIrqK14_w<^@3_8peVzYTH*@#9PZ!t< z_7*%+Xf2#nxVi8|;rE_7p5sLw#d1kV$;Of$B{!EGE_txzM9I&*Y2GirexJb?=S%bD z`^tSyz7F40z88J3`_B13@O|m?mzI~A%WP$NWu;{eWo>0YEbl0vS-zlrb@{dBd&_UH zoK)qgDyXWgYN_h1nq9T1YHii^)dkg+)h*SX)w8P?Rj;jnwdU5EBQ=lIoUS=r^LFj7 z+Jm(x>O$&T>N7@pN7auSKWf^jxug0UScA7=ZNrv^vkjj&<~QzZe6=Z}X?N4%rYD*{ zYL07eXg<>XT}x}rE2Gzr{^6LEv2(`m8+&r>A6wrYH+#H1{?`*s6FMf`I^n?ypSP`V zk8VHEey+pZF}`DW$Kj6S9cL$cCmx^pdS`rRUT14(f9HYD=Q=;=vUW}D+S>(>d0In+ z5OCRgb~X4FE~P+f!V)9S!+-P~0!)JZCPPvYXmwHV;bVX&^&V2LVAk#>79rTQdzr-v z`P#k0TCmco<>6u^ki8Vud6q2^?m;y3rED2n$NC{X&V%B7C9`3xs0SWRHW*kJV2`u_ zcUPl?4e!=L!?=_!V%@M7oP(TJwu&vp(+aj8PYw9LkM-gWU3-wT2G^CS)y6uIzXGYB zt>z_cus>glTByD8s9`a3ZO~G;;(jIGq``uo>Zf{oQI38~Ew17%Q$5t5`TSQC5iPeB z&lB(^RCajX7uS%7cau=2ANBR|_HFpWe4eN^we8WUxf@?eZLdM;s{seKuYnRav=}UN zxf<1xt3Z2`QNs$9rdFwMJ?M2e?z?fP=GyqztsH9Kby4k|DBp(?wxM3oxYC&005SSr zs+oGOj!*zr>evKFc_OT7SD~hU{Pp7NY|xYp|MgPj=L5^Y;|!9`cRy;p%s=2Ph^-(2 zi)2XsI^b^zxI6>+uP|_75#VM`(0D|H?=yp!CxgOx=p!h4m=&C03iw_dq{}qyZ#ux2 zW!qV&5qnZm3=r?fc?8AW4=WIW=K;LHn30Qu@{)g>k z3jm3Q!1_gi-(g_aa^Nmu1(a{`v!0&D_g=&E6LbSa;rKzhi&E_RjCw9qcjoIC~0;$)B+&*ptwv zUdvvD%JKpBbM_p2o}CtqY&Yo1twK1v9qZL+;C>FUJE6?Hk=@L0Vb4H%ixf;kln@P0 z+APGviO(X$3kgD^kR(`zWFbYrYDr%K{%O|+^;)Mr*J;o79yPzdNV}G3*D`+fj4G2G zSM@KY2T!5L%degS_3HKVLXBD@P2N$wlBW8CLMn%=$1tzIdv$MqPxp%6@Hu_G{k<#t zR`4g|;_jaQrAzp|p}S|*O0`gAPhWq}s>O2`^{!Q4^>h!Fy1Kttt14p7(v{skJ-tg- z@x4XWox8AB= z)lc_Yy}G)cq=ke4K!C5s*&TrRS2-Q`PyH|c-;0otf+PR{6!&GZ{|eOyk~(1lL7^{K z^;O6F3Va|&0I0BxwEUNw0sx>X0RSXEcKzZ$VR=P9008FgtIwAM{A&7a`jD2Vp#uP5 zNx$l9U!lEB>GGmyp=15!`~d*qF9qyNYQw>$=V*@)0Kk7a0Onr->z z<5w^}AFkjSf5|WR*BAs}K?t`2zGiG;@BHP8zV@RE004y=S(7OzK#|! zq6s;lyM>PP*SPlPU)$mT6(IN^l9oCa2461hYu~uP`Z=p zNN@yg-7nVHhlrun#svX@<^tFO&MV_f7GdfJ7z5X>RrPf>R2FgQNEUf{^H2*4+M~W* zc~m=1v?HP4bi2{b64CgH4deB{!P0vZHC^GeYb&r z@*GR6$#J{$Wq|v3U(h3Tf#$_+^GT)i6icg3=Xy8vWrD+LxD&OU+fDHE5>0|eef5*~ z6GEIu+4XhCW^Kc*-u$>`aH3iN_=&Ys$B5CNXPYt zhSYm{%Wja@DDG)>+sY?z<;%^j>*E<2*Zt)e+-;~eF){V+oCPW;gb&)5S$lF(hl}e* zStSkz*yP_zE(@rKUv6Qlho0IfF`+zeX|7$m!Ef<$_~SUEM`{pk?2;c@n{WG4 z&^wDaX2EsfD^>QIXG%{Y{u zgEG`c=S#T7wc}Q&=QGPgu){|d8n%tor=rLI8P4(LEz1q32TOC()dQU@;^{-S&Kkzz z5@!(djRRF|aOcdX_AKUTu!fRElvUJ~qa#joAkij+^4`_Dc{&{cLOG)6P- zE(e+WDjjb}^>C3@^U~RGH?n4PFcQaVL{(^=?&SB|+>sk+tNeLu4GxK$lJy7H;`*+` z^mBW}W9d5pw~v3xC+PYcSNkGSJN2=HXr;KT#>{DqX5w8--oL02rTLB1rhks}&+BEg zCnQ7bDRj7P1vs(m0@@A>i69dx8~=}7=fpy)K|SY5msO+xIsrEBf`Nt(xkSRXHVy0# z>=jop?lAi7`-kaGlx~uqCD-Sa(b-NrP4hdyL;r!8_!4)8 zU8+s)ot0eUZS;-DXF-KMvZ2z9#m9mS=KD6XU8N%z`N`BdWIex<#2HTG0?iDI+=J^T z+Sk$#rh6w%uT@cG0Y@csr~a?3QInb}!(ch;4Bn=V z^wnXxa`fY{Nh|J=msNU?Bl=cg0*SS9)J5Z;g5b~rqjJ!9$oaP05#G-(4xMuUqhYfpdz7fDY6i_XD(tCdaaTx5njO@ zD}N&Qud7nwwW3+C*lEvSiM42mR}hYzPA1w%%w6flGVU?8X7T>j>gBz~Q)z5J9y@d4 zGNidJ=63erTI@pl)Jd?D;zeWnGQ?Bqt~F;9rQJirN^5a7g!(yr;QJ(3dHXI4 zkl96Nt+KCY*-dH$hI3-r+5}49jC$Yoda3sqaL{u`oy=~O``AM|Sp9u# zQTp5<)SpgrxMn(7-z0;!$gb%xxy*)JzB~Pug}OH^bF7)-TJA5h-C9#jE+hx3y>IM| z_m{JI=0;; zX)K(V%&EhE*p6;AMSTt95g-3fFhQyU5;@Fuyf5x`eb6G&n9 z7n3Rp?c20-5U-I9=@CQ@A9E1jBw14omSZ>Cu8r873R#BRn#HNHeidI*)^fjzk=#q~ zCehl02mF>U$=b@>E!Q^baLb$WpjmlK*C!N=8nx*k`1+~PM)wP#BK-sYy{vGDENQ#e z5&sb)ZCM7lv4iZeCv5%(VOEZjZCSX;5$&FR>_j^{7Gggaj4?ZR?_CgVt=?;(2zYDv zaEXKF4k6-Oy5vL8A01uGifIQxe%gsr%6x@Fr=-xGFe+Ya0OG}l{N92id* zG8z~U@lNLFOG}lQ6ITyx)&BAhrzZ=XiqI^X9I)} z+EA6+G!Hu5a9M#S3{^8l4H)xGDDwZay1gDK^#A{_8yzhBb4+j+yHgFyW($mDq%tzU zR#Oa>Vq>U@G{jos?8%PhW*DJU40&fMjZ?rRYqLyH8OD8y<2A@z6&#Dt zX;y~kkjK2BXv;2mo^~cRe1SZ#RH=(jyvnwiT5j3^sGs^cIb=1Vc zMou&h6R;-Y4y?`4%R%^^AR7yHH0C}@o7(mXs%oN(D$g|(CpF%SYTq@i$3c*5Z4PAi zoo#1^4+QDH*lUHj-D79sft_V%YR3UQJ*BgV;Uy&bYtyrEk7{l>0jh#s?Kf7qeyyDE zwb#F~Bj!Tv88+%saY7$+aMD?DNp>=?KfC}i5#mYzeJ`y$r8A|cZEJH2sk1dIN;#|- zrL7GVLjU#&Pl!N?4*+D0K$!j2*U)o-#m6V!C!pR}(ci~M7MPFzQkPWct*3jeZ*rus zudipUZ>_7VYQyJ8cPJ2)7&(YLIy#247k#zMd#P?(S4X%_Jn$4C3j0=RA(=1m!@z7Bp`dHGC za<}pzOYkwvtY|^&7zDBaavt&?avbs;G7NGVvO4ktDLGjQ87)~g*);_unJC#XnF)mp zDG_OYNrv30d)L+Zl~uv#C+`E0q@uPmfMGtG_75$Pu_@KmoF0$76+jZ@ca%(&tPCL4 zG}y2NKc<+>S{}ovfbQe-<@5TJ|C8jy>P72~``v5HYxDE>=hA2O`}?)hS$8x91Rl0? z)n|7GL@HjHXVsC<{kz^H{HB}D<#BuK*Y+l-sA7}RClW$i*z*)DDI{)WiLLy zz!&f6a3D*DpGZ;Kd`f^YOw`{@j&M@cmbjW+o1U&S>R}JdVui%)I*Y|w}Td^FvC(~cY_cnF+x*fc7m6tvBJ~h{`Bt3+KQU0y81Iz zbd8H+B;;4mK)2Ady}Rr1X;Lj4sajjVh5fo1BYJPWJ5p+nN(D05X6t z5HuhS2<&T?hxkzpKm~aOAb=(RHH&p#(TL)d>idNdFvvo=2QGpdLq&m1QF&A>#}X}* z!b8dd%RN&e@Bk-bVyteRkWH^a9jF}>-mo-4e>r}1TZ`mvhPY?(gt`MA`}8WYRq2Hf z@qE)Jil4Ticq!Ue!(wM%2J19)oT4ww4IavN;@lbDvT$joHWJc&qm6d`8_7QV@Rkgn zToz{)X9vfwCOCFH?T^F~jsLrZb{7pzdaF=un@KN!RyPGXC%K-zpdOa--3b28!bwux zsjyeQe#h2WDI;?tgcw?p0x0?}uL?hZ82Jr5YPvQDEod6%zV4N@gn){ID9kwrW|?fP zPB>#466a=mYXLM031ibU1mTI<-d{6c00`jQ*8>3r0MO?r0K|D^&BMuAZT|U_^YO$~ zx#6M4e0ZUOYBYvO?Pg;&LMc$`Ou~o-a+%%#j298#Kgz#7mgmP9Vhmq)DD_I6y}Oz* zS-QP!R=%I|V&`L;87N&r`$ObZ^4q zjQl5%f?(dDWXIx!PH_HFv*6~D zZz|lJMeK)gQ@MA}rz{naC9;eVK0E^b6QUw83FuAqO2I&0xi%j!MfoC`fY{y@GOEHK zDCisGAPu0sX;goHUO!C|$EEc#CE-QdeA!thy`~nTMtvLk1S)0KEnT@6{RVB(se}}H z-O=*9g5f$*GpMzT9=^s_Z_c}6xGbySjaExtu7y@AQ#C;=mKl|UTW1NgMp61V*5&S! zwXi68vtL*WvH|SsN7u+alf|!tTzUOxtj@Stim1D=0V=$*H!N0^P2IjOw}|=SoRz2< zO3;&~0fzx32FPK3vfTo861-qk9F!dDxRRk*eNge#F7&#}!A;v{s;M;NX-12t=Pm~f znUbR!p`QKBP8)B&zR$M@FGnHLo-my!_Ipb136Z{@A8E~@A8>AgVmWsT>tXM4yWq`J zfEu0W4zcYn&^WL@0HVU8wHFZ-=o_`Ls@e`hy6p-P25N10KnE7P?xgkQTDnf7(OS59 z@XsT8^eY#vyW+5toDQVZSRAKrt_o?(wJqGmC_u_olrNT?buY>Y*krG>%_WWejM-Zu zBA5Ku?A3!o2_Pbz$MMP1_mcXluFDCDqZ|d_2`n%&ovxU%|ILc)X&frkWiM@10fCF3 z2h3XiTjo9wN)v2{QjZae4(zYoD*POWUr>93szL2l`0BxYs=|4|@dQ*KL69bp`a}{U zzS6qR0E%d6DZQA;hEqAgQ|@I#_`FFr*OAew5oV!}qD0p5>%>`nnEbD^$P5Yu!yv;H1gj+1?mW&aC=~XWL(B)5sr1$ zQz(R5BM%wfMv)*6$S|4SqNCT^6ZK3|R}=i?mB2mMDT5hkM${qB0$!8r#>e?U0`sG` zYFAaMs5fn!zdcP*GRL8;SiT=yv5!_%+Sl|nBgJPXMX9j1v#v6Ij0p(@(ONM_Q@K+- zl75JJSPP)SVy|U26Vj1)l%6dSa;tHdHFGOr-=xW(t$!{zYc<-eFPF5JGkbQmRWgZ} z(`i^GOw+_O*IcjO3ihidnlzm`ezhwFfg>V`0cHO^6}hKy(5i5>s;jlGK1P#pg7=E$ zmgErzv*TWZJNFBXzZ$Vth!w65Xbk~loO}F9nJQo6nM0y?t%{Qq|?DfPL=*hR^CWTwJVlvskPW__zu0p6Q@2KKf)XFf6C&0L@6Cjei zUV>@t{t4$1D4N-3ee~$o8c7L<2Dh=aXMw!%s@r(Zwf-?Hk?;t_l{;ns8#U71N33f6Jes zoff5Q7WAOK&G{*BA)5h{p^%b?=r1vrV`XeUf^0D}bD+c7dz8osKMG48E1O2?@{XmN zs+xW1mA!vsASoVe50wt|>7VKL(?L{$iVY}@y08L)Xvn!z8zMp3?u>-4PY>BAJ>EOr z0Q5B?T@J&2<|doEMP(3)z|Ax1~8f^Ai`N@L*Omm?Kf}r%?nWDmjD*7h}XQF!Tt(mbSxEN@BJc z7-w{JO!96tA)3PF-6A^2k5a2?U(ZG&mH0F2vdQ8gH<}z2dyIF0dgKgWBy*0HNi)HV z&nhjAyB;0^{GGVC3&}Fl3<=W$3F=Fqt_8uJNzUpK$Ry49S#L&Gq_Z!xgbg&%ZsGv0 z!Oap0ep%OUZ16Qt$R)}CU|}?=d07y+B9Y1XT_iGC@_2Ew8OgoS$$#je)=WY_s-*A2kr zqht(21U*o_IsCI z&o6)4gXDl73hnwxK)eY&$^G7;b*JP3pHN*~JX}3H=tGe*-y;3IvaY0H9}|QM8LFF) zNCxqEj!Q`Gyq{0YHp%4j%8lPiE^)kHUv-k|z2Bg`r+dzAug`4<1)V(Cw(u5z33h<5 zX>Yj|;d93IDuEsUNQh=9{>eNvgcBQ$rN0M`(abAk8TId&ZS-Z`(!#W_fGGKyy6qZt z1cS)YHRW_Sik`B4J|@nPMngi;F0Hm(YFgKiqz~-BQ(;)dOtHaIS#C^4pBE)zsXJAQ zUx*mQ_H!1C!*PyeJU(8Y<2Kz+U8q{7a07dWOKY_M)4XU10(sCu}7Q{v9sexG*Juz^ZTKfe$eUI4!w0>hDKoknY`Tt0u zCPClzzEWg3I(rzpn|mMfK%VTk8PYJ(T!g;?)CAd=0g4wh06&~BO6Z5ke`)_iimw)_ zIPiw{wwoWGo!!O;RrJE3z&*+2Nlu5@YScVkxfy=bdZX2$`~bbEI>Gia+3`a5ce`_l#knd(Ws!L&L}?yc`eZj{x|>JGdv zDIMvX++kA{9QTWXI3b)f6uBiqG*u=OBpA~U{KnBP1$s#p=0rIyhj*G_u4pt}%Q|qQ z@aY^TXupSSxP^k;BFalNMO6Q0NQi?#(;vj%vn48TNjH3Fqw z`wx1L|2LY!nEwV~E%bJQMm2;(Mm9?D$)E>;^YrA_2ahbt_)}~&Iev_|DWSq_JRTg3 zI6$wI@4wiWcRKQ(pXrJJoG8Fj^}{+%@JjdePv5_@V@?i9#64emAF#kFIIF7fkJ}z0 z#pI%`bgo(`UeKR<^iER(YywkW7(^+%^pGMM#+j(D`mf&*B7Txs<2W@xKMBH6Bh7?g zayO;YIAG&YC)*7+Hc)n$IoP<`NMpG2Vbo;o+PhQ?d0yZetI){*@@c&xbBa_?W`9@t88w84lTdl**PT;EAlQ)!8x2D$?@FA0&9Zo*)O5|2S zJzv;#F`pzDnOsv39&b!P3~dhrPr*}Zz*Ds;f--nf+0!T=-s(lbYYn!UF85t}ju0E{ zMx|%43ZePx4+6AUFMUMvQjaN#M`6D>?wZW?9%m>j`#;M~Sw!QSXP6 zdqgW!Wm{GKjj`rqL14+p4ujF^!g2s-JlxB&@A4>L$AesJrG;Q{W9=Fk`U}vNCxy$$ z8|Wk05MhQU0L8@>8k_KX4G(Sa29<&s5=_+TTQ+X63$)rJRha$eOS}Vrp%Su+_@RF@ z(TMjw*Bzc+M#UT9iTykksmaDN9$Qnno|Be$21=5b^~4Aod}Ct7+VraZZUPl!nzCNr zD5XyAWMqd%P1Xd;+3IqQi-B6%p=*LtwOAJR^;xgc9ew@h_@(;G zCbp~)(=vU2F~`-oG@q8_RzRHeWx7^BrjU%S>-^_Ysq}@z21Cc|$S_XkLb6fV?9=?* z`&?#{R)}j?%Mn>xO&?Atux3LBA1InC9iIf2+B zQHj1_q!X5GCQfe|_xA}voWAx&oPhNoF%!d{#FVna*DoP*P4}Uuhh7h$I4}Y7+nYwxF z?#}`hDarTsDXJ2VIb`E8dc)sv=Is_z`#cXo<*L!9vw^7f2lMAmEbdR2G!++Z_gHFD zZ+VgxG31Ondx~rK5K^93d%iV_PF$bsjH#VoPG0W`ZcT4>H8BLU zRI`wu)+liVmsc7<0iv?QpdU;!IJg5sH!q~19oS*O=)E~^mg15|tGS7I(am9vvs#|X zr956-_`j>5#KlVBU~S+{W|r)7*^j90!dErS4sOpwvm$$^gmJ=FuuV}JZ9Mf_G&S?- zu0;sb#R4bCob3(%Ocol%+ThNt5WDQ#>i@*IW>@FHT+^&O!m!s__oMKwNT{cBdt}6Q zwRm-+h;G(XGg`=KU+esss&A(-TkLpTw(D3{OD$!hvZPm)s!+Q*YQTK?9WidwneEyA z0%5;~W0A7?zO$%uI@CLuo@#hCYleswwFG*R1eLun`ysoDIYt z_ed~n(Fc?{7MMAffHs^j0LOusUS!J^u_?pfxz5>i5H)qEhS$pcSB?2~Cf8&W@<8~X zuwv&2{4>H^ydHbuwNzHE+A_|Vbm~N+(2^i7Pv=P|={n07xS6%Z2D4>zqj-hFIsN&{ zWtN&HAx!nHZAEx&C70krt+efox8ar-y8cR6rv zvEf;#!#7Pps2_s-w|4gZYVm|w)P}z*GtBaxi1hx@E9iD|KL7@NnDTlF*UsLysD>iM zWVf33Vm+?Sv|o<1w=#J`VBn>D>;-Zusl;ez|Hgn)6IONVuqkP^zhCaPAt;Oe?x?N*A;fHqAukWjE;*r7sGNr$uwHv?rcp68BQuEc{<4<4zU;W ze

    \n"; - template_footer(); -} - -/** - * show_log - * - * Actually show the log for this specific day - * - * @param PDO A PDO object referring to the database - * @return void - * @author Eli White - **/ -function show_log(PDO $db) { - $channel = $_GET['w']; - $day = $_GET['d']; - $parts = explode('-', $day); - $formatted_date = "{$parts[0]}-{$parts[1]}-{$parts[2]}"; - - // Begin the HTML page: - template_header('Date: ' . utf8specialchars($formatted_date) . - ' - Channel: ' . utf8specialchars($channel)); - - // Query the database to get all log lines for this date: - $prepared = $db->prepare(" - select time(tstamp) as t, type, nick, message - from logs - where lower(chan) = :chan and date(tstamp) = :day - order by tstamp asc - "); - $prepared->execute(array( - ':chan' => $channel, - ':day' => $day, - )); - - // Loop through each line, - foreach ($prepared as $row) { - // Prepare some basic details for output: - $color = nick_color($row['nick']); - $time = utf8specialchars($row['t']); - $msg = utf8specialchars($row['message']); - $nick = utf8specialchars($row['nick']); - $type = false; - - // Now change the format of the line based upon the type: - switch ($row['type']) { - case 4: // PRIVMSG (A Regular Message) - echo "[$time] <{$nick}> {$msg}
    \n"; - break; - case 5: // ACTION (emote) - echo "[$time] *{$nick} {$msg}
    \n"; - break; - case 1: // JOIN - echo "[$time] -> {$nick} joined the room.
    \n"; - break; - case 2: // PART (leaves channel) - echo "[$time] -> {$nick} left the room: {$msg}
    \n"; - break; - case 3: // QUIT (quits the server) - echo "[$time] -> {$nick} left the server: {$msg}
    \n"; - break; - case 6: // NICK (changes their nickname) - echo "[$time] -> {$nick} is now known as: {$msg}
    \n"; - break; - case 7: // KICK (booted) - echo "[$time] -> {$nick} boots {$msg} from the room.
    \n"; - break; - case 8: // MODE (changed their mode) - $type = 'MODE'; - case 9: // TOPIC (changed the topic) - $type = $type ? $type : 'TOPIC'; - echo "[$time] -> {$nick}: :{$type}: {$msg}
    \n"; - } - } - - // Finish up the page: - template_footer(); -} - -/** - * nick_color - * - * Uses a silly little algorithm to pick a consistent but unique(ish) color for - * any given username. NOTE: Augment this in the future to make it not generate - * 'close to white' ones, also maybe to ensure uniqueness? (Not allow two to have - * colors that are close to each other?) - * - * @return string A CSS valid hex color string - * @author Eli White - **/ -function nick_color($user) { - static $colors = array(); - - if (!isset($colors[$user])) { - $colors[$user] = substr(md5($user), 0, 6); - } - - return $colors[$user]; -} - -/** - * utf8specialchars - * - * Just a quick wrapper around htmlspecialchars - * - * @param string The UTF8 string to escape - * @return string An escaped and ready for HTML use string - * @author Eli White - **/ -function utf8specialchars($string) { - return htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); -} - - -/********** TEMPLATES **********/ - -/** - * template_header - * - * Echo out the header for each HTML page - * - * @param $title string The title to be used for this page. - * @return void - * @author Eli White - **/ -function template_header($title) { - $css = template_css(); - echo << - - - - Phergie LogViewer - {$title} - - - -

    Phergie LogViewer - {$title}

    -EOHTML; -} - -/** - * template_footer - * - * Echo out the bottom of each HTML page - * - * @return void - * @author Eli White - **/ -function template_footer() { - echo << - -EOHTML; -} - -/** - * template_css - * - * Generate the CSS used by these HTML pages & return it. - * - * @return string The CSS in question: - * @author Eli White - **/ -function template_css() { - return << - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie - */ - -/** - * Base class for end-user interfaces. - * - * @category Phergie - * @package Phergie - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie - */ -abstract class Phergie_Ui_Abstract -{ - /** - * Handler for when a server connection is attempted. - * - * @param string $host Server hostname - * - * @return void - */ - public function onConnect($host) - { - } - - /** - * Handler for when an attempt is made to load a plugin. - * - * @param string $plugin Short name of the plugin - * - * @return void - */ - public function onPluginLoad($plugin) - { - } - - /** - * Handler for when a plugin fails to load. - * - * @param string $plugin Short name of the plugin - * @param string $message Message describing the reason for the failure - * - * @return void - */ - public function onPluginFailure($plugin, $message) - { - } - - /** - * Handler for when the bot receives an IRC event. - * - * @param Phergie_Event_Abstract $event Received event - * @param Phergie_Connection $connection Connection on which the event - * was received - * - * @return void - */ - public function onEvent(Phergie_Event_Abstract $event, - Phergie_Connection $connection - ) { - } - - /** - * Handler for when the bot sends a command to a server. - * - * @param Phergie_Event_Command $event Event representing the command - * being sent - * @param Phergie_Connection $connection Connection on which the command - * is being sent - * - * @return void - */ - public function onCommand(Phergie_Event_Command $event, - Phergie_Connection $connection - ) { - } - - /** - * Handler for when the bot terminates a connection to a server. - * - * @param Phergie_Connection $connection Terminated connection - * - * @return void - */ - public function onQuit(Phergie_Connection $connection) - { - } - - /** - * Handler for when the bot shuts down after terminating all server - * connections. - * - * @return void - */ - public function onShutdown() - { - } -} diff --git a/plugins/Irc/extlib/phergie/Phergie/Ui/Console.php b/plugins/Irc/extlib/phergie/Phergie/Ui/Console.php deleted file mode 100644 index a0a528b3f2..0000000000 --- a/plugins/Irc/extlib/phergie/Phergie/Ui/Console.php +++ /dev/null @@ -1,223 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie - */ - -/** - * End-user interface that produces console output when running the bot from - * a shell. - * - * @category Phergie - * @package Phergie - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie - */ -class Phergie_Ui_Console extends Phergie_Ui_Abstract -{ - /** - * Flag that toggles all console output - * - * @var bool - */ - protected $enabled; - - /** - * Format for timestamps included in console output - * - * @var string - * @link http://php.net/date - */ - protected $format; - - /** - * Constructor to initialize object properties. - * - * @return void - */ - public function __construct() - { - $this->enabled = true; - $this->format = 'H:i:s'; - } - - /** - * Outputs a timestamped line to the console if console output is enabled. - * - * @param string $line Line to output - * - * @return void - */ - protected function console($line) - { - if ($this->enabled) { - echo date($this->format), ' ', $line, PHP_EOL; - } - } - - /** - * Returns whether console output is enabled. - * - * @return bool TRUE if console output is enabled, FALSE otherwise - */ - public function isEnabled() - { - return $this->enabled; - } - - /** - * Sets whether console output is enabled. - * - * @param bool $enabled TRUE to enable console output, FALSE otherwise, - * defaults to TRUE - * - * @return Phergie_Ui_Console Provides a fluent interface - */ - public function setEnabled($enabled = true) - { - $this->enabled = (bool) $enabled; - return $this; - } - - /** - * Returns the format used for timestamps in console output. - * - * @return string - * @link http://php.net/date - */ - public function getFormat() - { - return $this->format; - } - - /** - * Sets the format used for timestamps in console output, overwriting - * any previous format used. - * - * @param string $format Timestamp format - * - * @return Phergie_Ui_Console Provides a fluent interface - * @link http://php.net/date - */ - public function setFormat($format) - { - $this->format = (string) $format; - return $this; - } - - /** - * Outputs a prompt when a server connection is attempted. - * - * @param string $host Server hostname - * - * @return void - */ - public function onConnect($host) - { - $this->console('Connecting to ' . $host); - } - - /** - * Outputs a prompt when a plugin is loaded successfully. - * - * @param string $plugin Short name of the plugin - * - * @return void - */ - public function onPluginLoad($plugin) - { - $this->console('Loaded plugin ' . $plugin); - } - - /** - * Outputs a prompt when a plugin fails to load. - * - * @param string $plugin Short name of the plugin - * @param string $message Message describing the reason for the failure - * - * @return void - */ - public function onPluginFailure($plugin, $message) - { - $this->console('Unable to load plugin ' . $plugin . ' - ' . $message); - } - - /** - * Outputs a prompt when the bot receives an IRC event. - * - * @param Phergie_Event_Abstract $event Received event - * @param Phergie_Connection $connection Connection on which the - * event was received - * - * @return void - */ - public function onEvent(Phergie_Event_Abstract $event, - Phergie_Connection $connection - ) { - $host = $connection->getHostmask()->getHost(); - $this->console($host . ' <- ' . $event->getRawData()); - } - - /** - * Outputs a prompt when the bot sends a command to a server. - * - * @param Phergie_Event_Command $event Event representing the - * command being sent - * @param Phergie_Connection $connection Connection on which the - * command is being sent - * - * @return void - */ - public function onCommand(Phergie_Event_Command $event, - Phergie_Connection $connection - ) { - $plugin = $event->getPlugin()->getName(); - $host = $connection->getHostmask()->getHost(); - $type = strtoupper($event->getType()); - $args = implode(' ', $event->getArguments()); - $this->console( - $plugin . ' plugin: ' . - $host . ' -> ' . $type . ' ' . $args - ); - } - - /** - * Outputs a prompt when the bot terminates a connection to a server. - * - * @param Phergie_Connection $connection Terminated connection - * - * @return void - */ - public function onQuit(Phergie_Connection $connection) - { - $host = $connection->getHostmask()->getHost(); - $this->console('Disconnecting from ' . $host); - } - - /** - * Outputs a prompt when the bot shuts down after terminating all server - * connections. - * - * @return void - */ - public function onShutdown() - { - $this->console('Shutting down'); - } -} diff --git a/plugins/Irc/extlib/phergie/PhergiePackageTask.php b/plugins/Irc/extlib/phergie/PhergiePackageTask.php deleted file mode 100644 index dfc760a16d..0000000000 --- a/plugins/Irc/extlib/phergie/PhergiePackageTask.php +++ /dev/null @@ -1,110 +0,0 @@ -pkg->addMaintainer('lead', 'team', 'Phergie Development Team', 'team@phergie.org'); - - $path = str_replace('_', '/', $this->package) . '.php'; - if (file_exists($path)) { - $contents = file_get_contents($path); - preg_match_all('#/\*\*(.*)\*/#Ums', $contents, $matches, PREG_SET_ORDER); - $doc = $matches[1][1]; - - $have_summary = false; - $have_description = false; - foreach ($this->options as $option) { - switch ($option->getName()) { - case 'summary': - $have_summary = true; - break; - case 'description': - $have_descripion = true; - break; - } - } - - if (!$have_summary || !$have_description) { - $description = substr($doc, 0, strpos($doc, '@')); - $description = trim(preg_replace(array('#^[\h*]*|[\h*]*$#m', '#[\h]+#m'), array('', ' '), $description)); - $split = preg_split('/\v\v+/', $description); - $summary = trim(array_shift($split)); - if (!$have_summary) { - $this->pkg->setSummary(htmlentities($summary, ENT_QUOTES)); - } - if (!$have_description) { - $this->pkg->setDescription(htmlentities($description, ENT_QUOTES)); - } - } - - $doc = preg_split('/\v+/', $doc); - $doc = preg_grep('/@uses/', $doc); - $doc = preg_replace('/\s*\* @uses\s+|\s+$/', '', $doc); - foreach ($doc as $line) { - if (strpos($line, 'extension') === 0) { - $line = explode(' ', $line); - $name = $line[1]; - $optional = 'required'; - if (isset($line[2])) { - $optional = $line[2]; - } - $this->pkg->addExtensionDep( - $optional, - $name - ); - } else { - $line = explode(' ', $line); - $name = $line[0]; - $channel = $line[1]; - $optional = 'required'; - if (isset($line[2])) { - $optional = $line[2]; - } - $this->pkg->addPackageDepWithChannel( - $optional, - $name, - $channel - ); - } - } - } - - $newmap = array(); - foreach ($this->mappings as $key => $map) { - switch ($map->getName()) { - case 'releases': - $releases = $map->getValue(); - foreach ($releases as $release) { - $this->pkg->addRelease(); - if (isset($release['installconditions'])) { - if (isset($release['installconditions']['os'])) { - $this->pkg->setOsInstallCondition($release['installconditions']['os']); - } - } - if (isset($release['filelist'])) { - if (isset($release['filelist']['install'])) { - foreach ($release['filelist']['install'] as $file => $as) { - $this->pkg->addInstallAs($file, $as); - } - } - if (isset($release['filelist']['ignore'])) { - foreach ($release['filelist']['ignore'] as $file) { - $this->pkg->addIgnoreToRelease($file); - } - } - } - } - break; - - default: - $newmap[] = $map; - } - } - $this->mappings = $newmap; - - parent::setOptions(); - } -} diff --git a/plugins/Irc/extlib/phergie/README b/plugins/Irc/extlib/phergie/README deleted file mode 100644 index d97ce05242..0000000000 --- a/plugins/Irc/extlib/phergie/README +++ /dev/null @@ -1,11 +0,0 @@ -Phergie is an IRC bot written for PHP 5.2. - -Main project web site: http://phergie.org - -Instructions for running your own instance of Phergie: http://phergie.org/users/ - -Architectural overview for plugin developers: http://phergie.org/developers/ - -Support: http://phergie.org/support/ - -Bug reports/feature requests: http://github.com/elazar/phergie/issues diff --git a/plugins/Irc/extlib/phergie/Settings.php.dist b/plugins/Irc/extlib/phergie/Settings.php.dist deleted file mode 100755 index 87b4a95c68..0000000000 --- a/plugins/Irc/extlib/phergie/Settings.php.dist +++ /dev/null @@ -1,98 +0,0 @@ - array( - // Ex: All connection info for the Freenode network - array( - 'host' => 'irc.freenode.net', - 'port' => 6667, - 'username' => 'Elazar', - 'realname' => 'Matthew Turland', - 'nick' => 'Phergie2', - // 'password' => 'password goes here if needed', - // 'transport' => 'ssl', // uncomment to connect using SSL - // 'encoding' => 'UTF8', // uncomment if using UTF8 - ) - ), - - 'processor' => 'async', - 'processor.options' => array('usec' => 200000), - // Time zone. See: http://www.php.net/manual/en/timezones.php - 'timezone' => 'UTC', - - // Whitelist of plugins to load - 'plugins' => array( - // To enable a plugin, simply add a string to this array containing - // the short name of the plugin as shown below. - - // 'ShortPluginName', - - // Below is an example of enabling the AutoJoin plugin, for which - // the corresponding PEAR package is Phergie_Plugin_AutoJoin. This - // plugin allows you to set a list of channels in this configuration - // file that the bot will automatically join when it connects to a - // server. If you'd like to enable this plugin, simply install it, - // uncomment the line below, and set a value for the setting - // autojoin.channels (examples for which are located further down in - // this file). - - // 'AutoJoin', - - // A few other recommended plugins: - - // Servers randomly send PING events to clients to ensure that - // they're still connected and will eventually terminate the - - // connection if a PONG response is not received. The Pong plugin - // handles sending these responses. - - // 'Pong', - - // It's sometimes difficult to distinguish between a lack of - // activity on a server and the client not receiving data even - // though a connection remains open. The Ping plugin performs a self - // CTCP PING sporadically to ensure that its connection is still - // functioning and, if not, terminates the bot. - - // 'Ping', - - // Sometimes it's desirable to have the bot disconnect gracefully - // when issued a command to do so via a PRIVMSG event. The Quit - // plugin implements this using the Command plugin to intercept the - // command. - - // 'Quit', - ), - - // If set to true, this allows any plugin dependencies for plugins - // listed in the 'plugins' option to be loaded even if they are not - // explicitly included in that list - 'plugins.autoload' => true, - - // Enables shell output describing bot events via Phergie_Ui_Console - 'ui.enabled' => true, - - // Examples of supported values for autojoins.channel: - // 'autojoin.channels' => '#channel1,#channel2', - // 'autojoin.channels' => array('#channel1', '#channel2'), - // 'autojoin.channels' => array( - // 'host1' => '#channel1,#channel2', - // 'host2' => array('#channel3', '#channel4') - // ), - - // Examples of setting values for Ping plugin settings - - // This is the amount of time in seconds that the Ping plugin will wait - // to receive an event from the server before it initiates a self-ping - - // 'ping.event' => 300, // 5 minutes - - // This is the amount of time in seconds that the Ping plugin will wait - // following a self-ping attempt before it assumes that a response will - // never be received and terminates the connection - - // 'ping.ping' => 10, // 10 seconds - -); diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/ConnectionTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/ConnectionTest.php deleted file mode 100644 index ba94cd0ea6..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/ConnectionTest.php +++ /dev/null @@ -1,262 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Connection. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_ConnectionTest extends PHPUnit_Framework_TestCase -{ - /** - * Associative array containing an option-to-value mapping - * - * @var array - */ - private $options = array( - 'host' => 'example.com', - 'port' => 4080, - 'transport' => 'udp', - 'encoding' => 'ASCII', - 'nick' => 'MyNick', - 'username' => 'MyUsername', - 'realname' => 'MyRealName', - 'password' => 'MyPassword', - ); - - /** - * Data provider for testGetOptionReturnsDefault(). - * - * @return array Enumerated array of enumerated arrays each containing a - * set of parameters for a single call to - * testGetOptionReturnsDefault() - */ - public function dataProviderTestGetOptionReturnsDefault() - { - return array( - array('transport', 'tcp'), - array('encoding', 'ISO-8859-1'), - array('port', 6667), - array('password', null), - ); - } - - /** - * Tests that a default values are used for some options. - * - * @param string $option Name of the option with a default value - * @param mixed $value Default value of the option - * - * @return void - * @dataProvider dataProviderTestGetOptionReturnsDefault - */ - public function testGetOptionReturnsDefault($option, $value) - { - $connection = new Phergie_Connection; - $this->assertEquals($value, $connection->{'get' . ucfirst($option)}()); - } - - /** - * Tests that a default encoding is used if one isn't specified. - * - * @return void - */ - public function testGetEncodingReturnsDefault() - { - $connection = new Phergie_Connection; - $this->assertEquals('ISO-8859-1', $connection->getEncoding()); - } - - /** - * Tests that options can be set via the constructor. - * - * @return void - */ - public function testSetOptionsViaConstructor() - { - $connection = new Phergie_Connection($this->options); - foreach ($this->options as $key => $value) { - $this->assertEquals($value, $connection->{'get' . ucfirst($key)}()); - } - } - - /** - * Data provider for testGetHostmaskMissingDataGeneratesException(). - * - * @return array Enumerated array of enumerated arrays each containing a - * set of parameters for a single call to - * testGetHostmaskMissingDataGeneratesException() - */ - public function dataProviderTestGetHostmaskMissingDataGeneratesException() - { - return array( - array(null, $this->options['username'], $this->options['host']), - array($this->options['nick'], null, $this->options['host']), - array($this->options['nick'], $this->options['username'], null), - ); - } - - /** - * Tests that attempting to retrieve a hostmask without option values - * for all of its constituents generates an exception. - * - * @param string $nick Bot nick - * @param string $username Bot username - * @param string $host Server hostname - * - * @return void - * @dataProvider dataProviderTestGetHostmaskMissingDataGeneratesException - */ - public function testGetHostmaskMissingDataGeneratesException($nick, $username, $host) - { - $options = array( - 'nick' => $nick, - 'username' => $username, - 'host' => $host, - ); - - $connection = new Phergie_Connection($options); - - try { - $hostmask = $connection->getHostmask(); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Connection_Exception $e) { - return; - } catch (Exception $e) { - $this->fail('Unexpected exception was thrown'); - } - } - - /** - * Tests that attempting to retrieve a hostmask with all required - * options is successful. - * - * @return void - */ - public function testGetHostmaskWithValidData() - { - $options = array( - 'nick' => 'MyNick', - 'username' => 'MyUsername', - 'host' => 'example.com' - ); - - $connection = new Phergie_Connection($options); - $hostmask = $connection->getHostmask(); - $this->assertType('Phergie_Hostmask', $hostmask); - } - - /** - * Data provider for testGetRequiredOptionsWithoutValuesSet(). - * - * @return array Enumerated array of enumerated arrays each containing a - * set of parameters for a single call to - * testGetRequiredOptionsWithoutValuesSet() - */ - public function dataProviderTestGetRequiredOptionsWithoutValuesSet() - { - return array( - array('host'), - array('nick'), - array('username'), - array('realname'), - ); - } - - /** - * Tests that attempting to retrieve values of required options when no - * values are set results in an exception. - * - * @param string $option Option name - * - * @return void - * @dataProvider dataProviderTestGetRequiredOptionsWithoutValuesSet - */ - public function testGetRequiredOptionsWithoutValuesSet($option) - { - try { - $connection = new Phergie_Connection; - $value = $connection->{'get' . ucfirst($option)}(); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Connection_Exception $e) { - return; - } catch (Exception $e) { - $this->fail('Unexpected exception was thrown'); - } - } - - /** - * Tests that attempting to set an invalid value for the transport - * results in an exception. - * - * @return void - */ - public function testSetTransportWithInvalidValue() - { - $connection = new Phergie_Connection; - try { - $connection->setTransport('blah'); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Connection_Exception $e) { - return; - } catch (Exception $e) { - $this->fail('Unexpected exception was thrown'); - } - } - - /** - * Tests that attempting to set an invalid value for the encoding - * results in an exception. - * - * @return void - */ - public function testSetEncodingWithInvalidValue() - { - $connection = new Phergie_Connection; - try { - $connection->setEncoding('blah'); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Connection_Exception $e) { - return; - } catch (Exception $e) { - $this->fail('Unexpected exception was thrown'); - } - } - - /** - * Tests that options can be set collectively after the connection is - * instantiated. - * - * @return void - */ - public function testSetOptions() - { - $connection = new Phergie_Connection; - $connection->setOptions($this->options); - foreach ($this->options as $key => $value) { - $this->assertEquals($value, $connection->{'get' . ucfirst($key)}()); - } - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/HandlerTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/HandlerTest.php deleted file mode 100644 index 9ecdd327ae..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/HandlerTest.php +++ /dev/null @@ -1,837 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_Handler. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_HandlerTest extends PHPUnit_Framework_TestCase -{ - /** - * Plugin handler instance being tested - * - * @var Phergie_Plugin_Handler - */ - protected $handler; - - /** - * Mock Phergie_Config instance passed to the plugin handler constructor - * - * @var Phergie_Config - */ - protected $config; - - /** - * Mock Phergie_Event_Handler instance passed to the plugin handler - * constructor - * - * @var Phergie_Event_Handler - */ - protected $events; - - /** - * Returns a mock plugin instance. - * - * @param string $name Optional short name for the mock plugin, defaults - * to 'TestPlugin' - * @param array $methods Optional list of methods to override - * - * @return Phergie_Plugin_Abstract - */ - protected function getMockPlugin($name = 'TestPlugin', array $methods = array()) - { - $methods[] = 'getName'; - $plugin = $this->getMock('Phergie_Plugin_Abstract', $methods); - $plugin - ->expects($this->any()) - ->method('getName') - ->will($this->returnValue($name)); - return $plugin; - } - - /** - * Sets up a new handler instance before each test. - * - * @return void - */ - public function setUp() - { - $this->config = $this->getMock('Phergie_Config'); - $this->events = $this->getMock('Phergie_Event_Handler'); - $this->handler = new Phergie_Plugin_Handler( - $this->config, - $this->events - ); - } - - /** - * Tests iterability of the plugin handler. - * - * @return void - */ - public function testImplementsIteratorAggregate() - { - $reflection = new ReflectionObject($this->handler); - - $this->assertTrue( - $reflection->implementsInterface('IteratorAggregate'), - 'Handler does not implement IteratorAggregate' - ); - - $this->assertType( - 'Iterator', - $this->handler->getIterator(), - 'getIterator() must return an iterator' - ); - } - - /** - * Tests that a default iterator is returned if none is explicitly set. - * - * @return void - */ - public function testGetIteratorReturnsDefault() - { - $this->assertType( - 'Phergie_Plugin_Iterator', - $this->handler->getIterator() - ); - } - - /** - * Tests the ability to change the handler's iterator class when a valid - * class is specified. - * - * @return void - */ - public function testSetIteratorClassWithValidClass() - { - eval(' - class DummyIterator extends FilterIterator { - public function accept() { - return true; - } - } - '); - - $this->handler->setIteratorClass('DummyIterator'); - - $this->assertType( - 'DummyIterator', - $this->handler->getIterator() - ); - } - - /** - * Tests that a failure occurs when a nonexistent iterator class is - * specified. - * - * @return void - */ - public function testSetIteratorClassWithNonexistentClass() - { - try { - $this->handler->setIteratorClass('FooIterator'); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Plugin_Exception $e) { - return; - } - $this->fail('Unexpected exception was thrown'); - } - - /** - * Tests that a failure occurs when a class that is not a subclass of - * FilterIterator is specified. - * - * @return void - */ - public function testSetIteratorClassWithNonFilterIteratorClass() - { - try { - $this->handler->setIteratorClass('ArrayIterator'); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Plugin_Exception $e) { - return; - } - $this->fail('Unexpected exception was thrown'); - } - - /** - * Tests countability of the plugin handler. - * - * @return void - */ - public function testImplementsCountable() - { - $reflection = new ReflectionObject($this->handler); - - $this->assertTrue( - $reflection->implementsInterface('Countable'), - 'Handler does not implement Countable' - ); - - $this->assertType( - 'int', - count($this->handler), - 'count() must return an integer' - ); - } - - /** - * Tests the plugin handler exposing added plugins as instance - * properties of the handler via isset(). - * - * @return void - */ - public function testImplementsIsset() - { - $pluginName = 'TestPlugin'; - $this->assertFalse(isset($this->handler->{$pluginName})); - $plugin = $this->getMockPlugin($pluginName); - $this->handler->addPlugin($plugin); - $this->assertTrue(isset($this->handler->{$pluginName})); - } - - /** - * Tests the plugin handler exposing added plugins as instance - * properties of the handler. - * - * @depends testImplementsIsset - * @return void - */ - public function testImplementsGet() - { - $plugin = $this->getMockPlugin(); - $this->handler->addPlugin($plugin); - $name = $plugin->getName(); - $getPlugin = $this->handler->getPlugin($name); - $this->assertTrue(isset($this->handler->$name)); - $get = $this->handler->$name; - $this->assertSame($getPlugin, $get); - } - - /** - * Tests the plugin handler allowing for plugin removal via unset(). - * - * @depends testImplementsGet - * @return void - */ - public function testImplementsUnset() - { - $plugin = $this->getMockPlugin(); - $this->handler->addPlugin($plugin); - unset($this->handler->{$plugin->getName()}); - $this->assertFalse($this->handler->hasPlugin($plugin->getName())); - } - - /** - * Tests the plugin handler executing a callback on all contained - * plugins. - * - * @return void - */ - public function testImplementsCall() - { - foreach (range(1, 2) as $index) { - $plugin = $this->getMockPlugin('TestPlugin' . $index, array('callback')); - $plugin - ->expects($this->once()) - ->method('callback'); - $this->handler->addPlugin($plugin); - } - - $this->assertTrue($this->handler->callback()); - } - - /** - * Tests a newly instantiated handler not having plugins associated with - * it. - * - * @depends testImplementsCountable - * @return void - */ - public function testEmptyHandlerHasNoPlugins() - { - $this->assertEquals(0, count($this->handler)); - } - - /** - * Tests a newly instantiated handler not having autoloading enabled by - * default. - * - * @return void - */ - public function testGetAutoloadDefaultsToNotAutoload() - { - $this->assertFalse($this->handler->getAutoload()); - } - - /** - * Tests setAutoload(). - * - * @depends testGetAutoloadDefaultsToNotAutoload - * @return void - */ - public function testSetAutoload() - { - $this->assertSame( - $this->handler->setAutoload(true), - $this->handler, - 'setAutoload() does not provide a fluent interface' - ); - - $this->assertTrue( - $this->handler->getAutoload(), - 'setAutoload() had no effect on getAutoload()' - ); - } - - /** - * Tests addPath() providing a fluent interface. - * - * @return void - */ - public function testAddPathProvidesFluentInterface() - { - $handler = $this->handler->addPath(dirname(__FILE__)); - $this->assertSame($this->handler, $handler); - } - - /** - * Tests addPath() throwing an exception when it cannot read the - * directory. - * - * @return void - */ - public function testAddPathThrowsExceptionOnUnreadableDirectory() - { - try { - $this->handler->addPath('/an/unreadable/directory/path'); - } catch(Phergie_Plugin_Exception $e) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_DIRECTORY_NOT_READABLE, - $e->getCode() - ); - return; - } - - $this->fail('An expected exception has not been raised'); - } - - /** - * Tests adding a path to the plugin handler. - * - * @return void - */ - public function testAddPath() - { - $pluginName = 'Mock'; - - try { - $this->handler->addPlugin($pluginName); - } catch(Phergie_Plugin_Exception $e) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_CLASS_NOT_FOUND, - $e->getCode() - ); - } - - if (!isset($e)) { - $this->fail('Plugin loaded, path was already present'); - } - - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - - try { - $this->handler->addPlugin($pluginName); - } catch(Phergie_Plugin_Exception $e) { - $this->fail('Added path, plugin still not found'); - } - } - - /** - * Tests addPlugin() returning an added plugin instance. - * - * @return void - */ - public function testAddPluginByInstanceReturnsPluginInstance() - { - $plugin = $this->getMockPlugin(); - $returnedPlugin = $this->handler->addPlugin($plugin); - $this->assertSame( - $returnedPlugin, - $plugin, - 'addPlugin() does not return the instance passed to it' - ); - } - - /** - * Tests adding a plugin to the handler using the plugin's short name. - * - * @return void - */ - public function testAddPluginByShortName() - { - $pluginName = 'Mock'; - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - - $returnedPlugin = $this->handler->addPlugin($pluginName); - $this->assertTrue($this->handler->hasPlugin($pluginName)); - - $this->assertType( - 'Phergie_Plugin_Mock', - $this->handler->getPlugin($pluginName) - ); - - $this->assertSame( - $this->handler->getPlugin($pluginName), - $returnedPlugin, - 'Handler does not contain added plugin' - ); - } - - - /** - * Tests adding a plugin instance to the handler. - * - * @return void - */ - public function testAddPluginByInstance() - { - $plugin = $this->getMockPlugin(); - $returnedPlugin = $this->handler->addPlugin($plugin); - $this->assertTrue($this->handler->hasPlugin('TestPlugin')); - - $this->assertSame( - $plugin, - $returnedPlugin, - 'addPlugin() does not return added plugin instance' - ); - - $this->assertSame( - $plugin, - $this->handler->getPlugin('TestPlugin'), - 'getPlugin() does not return added plugin instance' - ); - } - - /** - * Tests addPlugin() throwing an exception when the plugin class file - * can't be found. - * - * @return void - */ - public function testAddPluginThrowsExceptionWhenPluginFileNotFound() - { - try { - $this->handler->addPlugin('TestPlugin'); - } catch(Phergie_Plugin_Exception $e) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_CLASS_NOT_FOUND, - $e->getCode() - ); - return; - } - - $this->fail('An expected exception has not been raised'); - } - - /** - * Recursively removes all files and subdirectories in a directory. - * - * @param string $path Directory path - * @return void - */ - private function removeDirectory($path) - { - if (file_exists($path)) { - $it = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($path), - RecursiveIteratorIterator::CHILD_FIRST - ); - foreach ($it as $entry) { - if ($it->isDot()) { - continue; - } - if ($entry->isDir()) { - rmdir($entry->getPathname()); - } else { - unlink($entry->getPathname()); - } - } - } - } - - /** - * Tests addPlugin() throwing an exception when the plugin class file is - * found, but does not contain the plugin class as expected. - * - * @return void - */ - public function testAddPluginThrowsExceptionWhenPluginClassNotFound() - { - $path = sys_get_temp_dir() . '/Phergie/Plugin'; - $this->removeDirectory(dirname($path)); - mkdir($path, 0777, true); - touch($path . '/TestPlugin.php'); - $this->handler->addPath($path, 'Phergie_Plugin_'); - - try { - $this->handler->addPlugin('TestPlugin'); - } catch(Phergie_Plugin_Exception $e) { } - - if (isset($e)) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_CLASS_NOT_FOUND, - $e->getCode() - ); - } else { - $this->fail('An expected exception has not been raised'); - } - - $this->removeDirectory(dirname($path)); - } - - /** - * Tests addPlugin() throwing an exception when trying to instantiate a - * class that doesn't extend Phergie_Plugin_Abstract. - * - * @return void - */ - public function testAddPluginThrowsExceptionIfRequestingNonPlugin() - { - try { - $this->handler->addPlugin('Handler'); - } catch(Phergie_Plugin_Exception $e) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_INCORRECT_BASE_CLASS, - $e->getCode() - ); - return; - } - - $this->fail('An expected exception has not been raised'); - } - - /** - * Tests addPlugin() throwing an exception when trying to instantiate a - * class that can't be instantiated. - * - * @return void - */ - public function testAddPluginThrowsExceptionIfPluginNotInstantiable() - { - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - try { - $this->handler->addPlugin('TestNonInstantiablePluginFromFile'); - } catch(Phergie_Plugin_Exception $e) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_CLASS_NOT_INSTANTIABLE, - $e->getCode() - ); - return; - } - - $this->fail('An expected exception has not been raised'); - } - - /** - * Tests adding a plugin by its short name with arguments passed to the - * plugin constructor. - * - * @return void - */ - public function testAddPluginShortNamePassesArgsToConstructor() - { - $pluginName = 'Mock'; - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - - $arguments = array('a', 'b', 'c'); - $plugin = $this->handler->addPlugin($pluginName, $arguments); - - $this->assertAttributeSame( - $arguments, - 'arguments', - $plugin, - 'Arguments do not match' - ); - } - - /** - * Tests addPlugin() passing Phergie_Config to an instantiated plugin. - * - * @return void - */ - public function testAddPluginPassesConstructorArguments() - { - $pluginName = 'Mock'; - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - $plugin = $this->handler->addPlugin($pluginName); - - $this->assertSame( - $this->config, - $plugin->getConfig(), - 'Phergie_Config instances do not match' - ); - - $this->assertSame( - $this->events, - $plugin->getEventHandler(), - 'Phergie_Event_Handler instances do not match' - ); - } - - /** - * Tests addPlugin() calling onLoad() on an instantiated plugin. - * - * @return void - */ - public function testAddPluginCallsOnLoadOnInstantiatedPlugin() - { - $plugin = $this->getMockPlugin(null, array('onLoad')); - $plugin - ->expects($this->once()) - ->method('onLoad'); - $this->handler->addPlugin($plugin); - } - - /** - * Tests addPlugin() returning the same plugin when called twice. - * - * @return void - */ - public function testAddPluginReturnsSamePluginWhenAskedTwice() - { - $pluginName = 'Mock'; - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - $plugin1 = $this->handler->addPlugin($pluginName); - $plugin2 = $this->handler->addPlugin($pluginName); - $this->assertSame($plugin1, $plugin2); - } - - /** - * Tests getPlugin() throwing an exception when trying to get an - * unloaded plugin with autoload disabled. - * - * @depends testGetAutoloadDefaultsToNotAutoload - * @return void - */ - public function testExceptionThrownWhenLoadingPluginWithoutAutoload() - { - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - - try { - $this->handler->getPlugin('Mock'); - } catch (Phergie_Plugin_Exception $expected) { - $this->assertEquals( - Phergie_Plugin_Exception::ERR_PLUGIN_NOT_LOADED, - $expected->getCode() - ); - return; - } - - $this->fail('An expected exception has not been raised'); - } - - /** - * Tests addPlugins() with a plugin short name and no plugin constructor - * arguments. - * - * @depends testAddPluginByShortName - * @depends testAddPluginByInstance - * @return void - */ - public function testAddPluginsWithoutArguments() - { - $prefix = 'Phergie_Plugin_'; - $this->handler->addPath(dirname(__FILE__), $prefix); - - $plugin = 'Mock'; - $this->handler->addPlugins(array($plugin)); - $returnedPlugin = $this->handler->getPlugin($plugin); - $this->assertContains( - get_class($returnedPlugin), - $prefix . $plugin, - 'Short name plugin not of expected class' - ); - } - - /** - * Tests addPlugins() with a plugin short name and plugin constructor - * arguments. - * - * @depends testAddPluginByShortName - * @depends testAddPluginByInstance - * @return void - */ - public function testAddPluginsWithArguments() - { - $prefix = 'Phergie_Plugin_'; - $this->handler->addPath(dirname(__FILE__), $prefix); - - $arguments = array(1, 2, 3); - $plugin = array('Mock', $arguments); - $this->handler->addPlugins(array($plugin)); - $returnedPlugin = $this->handler->getPlugin('Mock'); - $this->assertEquals( - $arguments, - $returnedPlugin->getArguments(), - 'Constructor arguments for instance plugin do not match' - ); - } - - /** - * Tests removePlugin() with a plugin instance. - * - * @depends testAddPluginByInstance - * @return void - */ - public function testRemovePluginByInstance() - { - $plugin = $this->getMockPlugin(); - $this->handler->addPlugin($plugin); - $this->handler->removePlugin($plugin); - $this->assertFalse( - $this->handler->hasPlugin($plugin->getName()), - 'Plugin was not removed' - ); - } - - /** - * Tests removePlugin() with a plugin short name. - * - * @depends testAddPluginByShortName - * @return void - */ - public function testRemovePluginByShortName() - { - $plugin = 'Mock'; - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - - $this->handler->addPlugin($plugin); - $this->handler->removePlugin($plugin); - $this->assertFalse( - $this->handler->hasPlugin($plugin), - 'Plugin was not removed' - ); - } - - /** - * Tests getPlugin() when the plugin is not already loaded and - * autoloading is disabled. - * - * @depends testSetAutoload - * @return void - */ - public function testGetPluginWithAutoloadEnabled() - { - $this->handler->setAutoload(true); - $this->handler->addPath(dirname(__FILE__), 'Phergie_Plugin_'); - $plugin = $this->handler->getPlugin('Mock'); - $this->assertType( - 'Phergie_Plugin_Mock', - $plugin, - 'Retrieved plugin not of expected class' - ); - } - - /** - * Tests getPlugins(). - * - * @depends testGetPluginWithAutoloadEnabled - * @return void - */ - public function testGetPlugins() - { - $plugin1 = $this->getMockPlugin('TestPlugin1'); - $this->handler->addPlugin($plugin1); - - $plugin2 = $this->getMockPlugin('TestPlugin2'); - $this->handler->addPlugin($plugin2); - - $expected = array( - 'testplugin1' => $plugin1, - 'testplugin2' => $plugin2, - ); - - $actual = $this->handler->getPlugins(); - $this->assertEquals($expected, $actual); - - $actual = $this->handler->getPlugins(array('testplugin1', 'testplugin2')); - $this->assertEquals($expected, $actual); - } - - /** - * Tests that multiple plugin iterators can be used concurrently. - * - * @return void - */ - public function testUseMultiplePluginIteratorsConcurrently() - { - $plugin1 = $this->getMockPlugin('TestPlugin1'); - $this->handler->addPlugin($plugin1); - - $plugin2 = $this->getMockPlugin('TestPlugin2'); - $this->handler->addPlugin($plugin2); - - $iterator1 = $this->handler->getIterator(); - $iterator1->next(); - $this->assertSame($plugin2, $iterator1->current()); - - $iterator2 = $this->handler->getIterator(); - $this->assertSame($plugin1, $iterator2->current()); - } - - /** - * Tests adding plugin paths via configuration. - * - * @return void - */ - public function testAddPluginPathsViaConfiguration() - { - $dir = dirname(__FILE__); - $prefix = 'Phergie_Plugin_'; - $paths = array($dir => $prefix); - $this->config - ->expects($this->any()) - ->method('offsetExists') - ->will($this->returnValue(true)); - $this->config - ->expects($this->any()) - ->method('offsetGet') - ->will($this->returnValue($paths)); - - // Reinitialize the handler so the configuration change takes effect - // within the constructor - $this->handler = new Phergie_Plugin_Handler( - $this->config, - $this->events - ); - - $this->handler->setAutoload(true); - $this->handler->getPlugin('Mock'); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/IteratorTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/IteratorTest.php deleted file mode 100644 index 336b25d355..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/IteratorTest.php +++ /dev/null @@ -1,151 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_Iterator. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_IteratorTest extends PHPUnit_Framework_TestCase -{ - /** - * Iterator instance being tested - * - * @var Phergie_Plugin_Iterator - */ - protected $iterator; - - /** - * List of mock plugin instances to be iterated - * - * @var array - */ - protected $plugins; - - /** - * Initializes the iterator instance being tested. - * - * @return void - */ - public function setUp() - { - $this->plugins = array(); - foreach (range(0, 4) as $index) { - $plugin = $this->getMock('Phergie_Plugin_Abstract'); - $plugin - ->expects($this->any()) - ->method('getName') - ->will($this->returnValue($index)); - $this->plugins[] = $plugin; - } - - $this->iterator = new Phergie_Plugin_Iterator( - new ArrayIterator($this->plugins) - ); - } - - /** - * Tests that all plugins are iterated when no filters are applied. - */ - public function testIteratesAllPluginsWithNoFilters() - { - $expected = range(0, 4); - $actual = array(); - foreach ($this->iterator as $plugin) { - $actual[] = $plugin->getName(); - } - $this->assertEquals($expected, $actual); - } - - /** - * Tests that appropriate plugins are iterated when plugin name filters - * are applied. - */ - public function testIteratesPluginsWithNameFilters() - { - // Test acceptance of strings and fluent interface implementation - $returned = $this->iterator->addPluginFilter('0'); - $this->assertSame($this->iterator, $returned); - - // Test acceptance of arrays - $this->iterator->addPluginFilter(array('1', '3')); - - // Test application of filters to iteration - $expected = array('2', '4'); - $actual = array(); - foreach ($this->iterator as $plugin) { - $actual[] = $plugin->getName(); - } - $this->assertEquals($expected, $actual); - } - - /** - * Tests that appropriate plugins are iterated when method name filters - * are applied. - * - * The same method name is used in all cases here because mocked methods - * of mock objects do not appear to be detected by method_exists() or - * ReflectionClass, so filtering by a method defined in the base plugin - * class seems the easiest way to test that method filtering really - * works. - */ - public function testIteratesPluginsWithMethodFilters() - { - // Tests acceptance of strings and fluent interface implementation - $returned = $this->iterator->addMethodFilter('getName'); - $this->assertSame($this->iterator, $returned); - - // Test acceptance of arrays - $this->iterator->addMethodFilter(array('getName', 'getName')); - - // Test application of filters to iteration - $expected = array(); - $actual = array(); - foreach ($this->iterator as $plugin) { - $actual[] = $plugin->getName(); - } - $this->assertEquals($expected, $actual); - } - - /** - * Tests that all plugins are iterated after filters are cleared. - * - * @depends testIteratesPluginsWithNameFilters - * @depends testIteratesPluginsWithMethodFilters - */ - public function testIteratesPluginsAfterClearingFilters() - { - $this->iterator->addPluginFilter('0'); - $this->iterator->addMethodFilter('method1'); - $this->iterator->clearFilters(); - - $expected = range(0, 4); - $actual = array(); - foreach ($this->iterator as $plugin) { - $actual[] = $plugin->getName(); - } - $this->assertEquals($expected, $actual); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/KarmaTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/KarmaTest.php deleted file mode 100644 index 6b72316743..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/KarmaTest.php +++ /dev/null @@ -1,335 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_Karma. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_KarmaTest extends Phergie_Plugin_TestCase -{ - /** - * Skips tests if the SQLite PDO driver is not available. - * - * @return void - */ - public function setUp() - { - if (!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) { - $this->markTestSkipped('PDO or pdo_sqlite extension is required'); - } - - parent::setUp(); - } - - /** - * Configures the plugin to use a temporary copy of the database. - * - * @return PDO Connection to the temporary database - */ - private function createMockDatabase() - { - $dbPath = $this->getPluginsPath('Karma/karma.db'); - $db = $this->getMockDatabase($dbPath); - $this->plugin->setDb($db); - return $db; - } - - /** - * Tests the requirement of the Command plugin. - * - * @return void - */ - public function testRequiresCommandPlugin() - { - $this->assertRequiresPlugin('Command'); - $this->plugin->onLoad(); - } - - /** - * Initiates a karma event with a specified term. - * - * @param string $term Karma term - * - * @return Phergie_Event_Request Initiated mock event - */ - private function initiateKarmaEvent($term) - { - $args = array( - 'receiver' => $this->source, - 'text' => 'karma ' . $term - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - return $event; - } - - /** - * Checks for an expected karma response. - * - * @param Phergie_Event_Request $event Event containing the karma - * request - * @param string $term Karma term - * @param string $response Portion of the response - * message following the term - * from the original event - * - * @return void - */ - private function checkForKarmaResponse($event, $term, $response) - { - $text = $event->getNick() . ': ' . $response; - $this->assertEmitsEvent('privmsg', array($event->getSource(), $text)); - $this->plugin->onCommandKarma($term); - } - - /** - * Tests that a default database is used when none is specified. - * - * @return void - */ - public function testGetDb() - { - $db = $this->plugin->getDb(); - $this->assertType('PDO', $db); - } - - /** - * Tests specifying a custom database for the plugin to use. - * - * @return void - */ - public function testSetDb() - { - $db = $this->createMockDatabase(); - $this->assertSame($db, $this->plugin->getDb()); - } - - /** - * Tests that issuing the karma command with an unknown term returns a - * neutral rating. - * - * @return void - */ - public function testKarmaCommandOnUnknownTerm() - { - $term = 'foo'; - $this->createMockDatabase(); - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, $term . ' has neutral karma.'); - } - - /** - * Tests that issuing the karma command with the term "me" returns the - * the karma rating for the initiating user. - * - * @return void - */ - public function testKarmaCommandOnUser() - { - $term = 'me'; - $this->createMockDatabase(); - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, 'You have neutral karma.'); - } - - /** - * Tests that issuing the karma command with a term that has a fixed - * karma rating results in that rating being returned. - * - * @return void - */ - public function testKarmaCommandWithFixedKarmaTerm() - { - $term = 'phergie'; - $this->createMockDatabase(); - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, 'phergie has karma of awesome.'); - } - - /** - * Supporting method that tests the result of a karma term rating change. - * - * @param string $term Karma term for which the rating is being - * changed - * @param string $operation ++ or -- - * @param int $karma Expected karma rating after the change is - * applied - */ - private function checkForKarmaRatingChange($term, $operation, $karma) - { - $args = array( - 'receiver' => $this->source, - 'text' => $term . $operation - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - $this->plugin->onPrivmsg(); - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, $term . ' has karma of ' . $karma . '.'); - } - - /** - * Tests incrementing the karma rating of a new term. - * - * @return void - */ - public function testIncrementingKarmaRating() - { - $this->createMockDatabase(); - $this->checkForKarmaRatingChange('foo', '++', 1); - } - - /** - * Tests decrementing the karma rating of a new term. - * - * @return void - */ - public function testDecrementingKarmaRating() - { - $this->createMockDatabase(); - $this->checkForKarmaRatingChange('foo', '--', -1); - } - - /** - * Tests modifying the karma rating of an existing term. - * - * @return void - */ - public function testChangingExistingKarmaRating() - { - $term = 'foo'; - $this->createMockDatabase(); - $this->checkForKarmaRatingChange($term, '++', 1); - $this->checkForKarmaRatingChange($term, '++', 2); - } - - /** - * Tests resetting the karma rating of an existing term to 0. - * - * @return void - */ - public function testResettingExistingKarmaRating() - { - $term = 'foo'; - $this->createMockDatabase(); - $this->checkForKarmaRatingChange($term, '++', 1); - $this->plugin->onCommandReincarnate($term); - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, $term . ' has neutral karma.'); - } - - /** - * Data provider for testKarmaComparisons(). - * - * @return array Enumerated array of enumerated arrays each containing a - * set of parameter values for a single call to - * testKarmaComparisons() - */ - public function dataProviderTestKarmaComparisons() - { - $term1 = 'foo'; - $term2 = 'bar'; - - $positive = 'True that.'; - $negative = 'No sir, not at all.'; - - return array( - array($term1, $term2, 1, 0, '>', $positive), - array($term1, $term2, 0, 1, '>', $negative), - array($term1, $term2, 1, 1, '>', $negative), - array($term1, $term2, 1, 0, '<', $negative), - array($term1, $term2, 0, 1, '<', $positive), - array($term1, $term2, 1, 1, '<', $negative), - array($term1, 'phergie', 1, 0, '>', $positive), - array('phergie', $term2, 0, 1, '<', $positive), - array($term1, 'everything', 0, 0, '>', $positive), - array('everything', $term2, 0, 0, '>', $positive), - ); - } - - /** - * Tests comparing the karma ratings of two terms. - * - * @param string $term1 First term - * @param string $term2 Second term - * @param int $karma1 Karma rating of the first time, 0 or 1 - * @param int $karma2 Karma rating of the second term, 0 or 1 - * @param string $operator Comparison operator, > or < - * @param string $response Response to check for - * - * @return void - * @dataProvider dataProviderTestKarmaComparisons - */ - public function testKarmaComparisons($term1, $term2, $karma1, $karma2, - $operator, $response - ) { - $db = $this->createMockDatabase(); - - // Reduce answer tables to expected response - $stmt = $db->prepare('DELETE FROM positive_answers WHERE answer != ?'); - $stmt->execute(array($response)); - $stmt = $db->prepare('DELETE FROM negative_answers WHERE answer != ?'); - $stmt->execute(array($response)); - - if ($karma1) { - $this->checkForKarmaRatingChange($term1, '++', 1); - } - - if ($karma2) { - $this->checkForKarmaRatingChange($term2, '++', 1); - } - - $args = array( - 'receiver' => $this->source, - 'text' => $term1 . ' ' . $operator . ' ' . $term2 - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - - // Test lack of a response for terms with fixed karma ratings - if ($term1 == 'phergie' || $term2 == 'phergie') { - $callback = 'assertDoesNotEmitEvent'; - } else { - $callback = 'assertEmitsEvent'; - } - - $this->$callback('privmsg', array($event->getSource(), $response)); - $this->plugin->onPrivmsg(); - - // Test for karma changes when one term is "everything" - if ($term1 == 'everything' || $term2 == 'everything') { - if ($term1 == 'everything') { - $term = $term2; - $karma = ($operator == '>') ? -1 : 1; - } else { - $term = $term1; - $karma = ($operator == '>') ? 1 : -1; - } - $event = $this->initiateKarmaEvent($term); - $this->checkForKarmaResponse($event, $term, $term . ' has karma of ' . $karma . '.'); - } - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/Mock.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/Mock.php deleted file mode 100755 index 44a5d11c7c..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/Mock.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Creates a plugin on the filesystem that can be used by - * Phergie_Plugin_Handler::addPath() to be located and loaded. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_Mock extends Phergie_Plugin_Abstract -{ - /** - * Arguments passed to the constructor - * - * @var array - */ - protected $arguments; - - /** - * Stores all arguments for later use. - * - * @return void - */ - public function __construct() - { - $this->arguments = func_get_args(); - } - - /** - * Returns all constructor arguments. - * - * @return array Enumerated array containing the arguments passed to the - * constructor in order - */ - public function getArguments() - { - return $this->arguments; - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PingTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PingTest.php deleted file mode 100644 index ac30d46ffe..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PingTest.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_Ping. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_PingTest extends Phergie_Plugin_TestCase -{ - /** - * Tests that the last ping and event are initialized on connection to - * the server. - * - * @return void - */ - public function testOnConnect() - { - $this->plugin->onConnect(); - - $expected = time(); - $actual = $this->plugin->getLastEvent(); - $this->assertEquals($expected, $actual); - - $expected = null; - $actual = $this->plugin->getLastPing(); - $this->assertEquals($expected, $actual); - } - - /** - * Tests that the last event is reset when an event occurs. - * - * @return void - */ - public function testPreEvent() - { - $this->plugin->preEvent(); - - $expected = time(); - $actual = $this->plugin->getLastEvent(); - $this->assertEquals($expected, $actual); - } - - /** - * Tests that the last ping is reset when a ping is received. - * - * @return void - */ - public function testOnPingResponse() - { - $this->plugin->onPingResponse(); - - $expected = null; - $actual = $this->plugin->getLastPing(); - $this->assertEquals($expected, $actual); - } - - /** - * Tests that the test suite is able to manipulate the value of the last - * event. - * - * @return void - */ - public function testSetLastEvent() - { - $expected = time() + 1; - $this->plugin->setLastEvent($expected); - $actual = $this->plugin->getLastEvent(); - $this->assertEquals($expected, $actual); - - $this->plugin->setLastEvent(); - $expected = time(); - $actual = $this->plugin->getLastEvent(); - $this->assertEquals($expected, $actual); - - try { - $this->plugin->setLastEvent('foo'); - $this->fail('Expected exception was not thrown'); - } catch (Exception $e) { } - } - - /** - * Tests that the test suite is able to manipulate the value of the last - * ping. - * - * @return void - */ - public function testSetLastPing() - { - $expected = time() + 1; - $this->plugin->setLastPing($expected); - $actual = $this->plugin->getLastPing(); - $this->assertEquals($expected, $actual); - - $this->plugin->setLastPing(); - $expected = time(); - $actual = $this->plugin->getLastPing(); - $this->assertEquals($expected, $actual); - - try { - $this->plugin->setLastPing('foo'); - $this->fail('Expected exception was not thrown'); - } catch (Exception $e) { } - } - - /** - * Tests that a ping event is sent after the appropriate time period has - * lapsed since receiving an event. - * - * @depends testSetLastEvent - * @return void - */ - public function testPing() - { - $pingEvent = 10; - $this->setConfig('ping.event', $pingEvent); - $lastEvent = time() - ($pingEvent + 1); - $this->plugin->setLastEvent($lastEvent); - $expected = time(); - $this->assertEmitsEvent('ping', array($this->nick, $expected)); - $this->plugin->onTick(); - $actual = $this->plugin->getLastPing(); - $this->assertEquals($expected, $actual); - } - - /** - * Tests that a quit event is sent after the appropriate time period has - * lapsed since sending a ping event. - * - * @depends testPing - * @return void - */ - public function testQuit() - { - $pingPing = 10; - $this->setConfig('ping.ping', $pingPing); - $lastPing = time() - ($pingPing + 1); - $this->plugin->setLastPing($lastPing); - $this->assertEmitsEvent('quit'); - $this->plugin->onTick(); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PongTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PongTest.php deleted file mode 100644 index e8351fef24..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/PongTest.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_Pong. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_PongTest extends Phergie_Plugin_TestCase -{ - /** - * Test that a pong event is sent when a ping event is received. - * - * @return void - */ - public function testPong() - { - $expected = 'irc.freenode.net'; - $event = $this->getMockEvent('ping', array($expected)); - $this->plugin->setEvent($event); - $this->assertEmitsEvent('pong', array($expected)); - $this->plugin->onPing(); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/SpellCheckTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/SpellCheckTest.php deleted file mode 100644 index 369a0c6444..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/SpellCheckTest.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_SpellCheck. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_SpellCheckTest extends Phergie_Plugin_TestCase -{ - /** - * Checks for the pspell extension. - * - * @return void - */ - public function setUp() - { - parent::setUp(); - - if (!extension_loaded('pspell')) { - $this->markTestSkipped('pspell extension not available'); - } - } - - /** - * Tests for the plugin failing to load when the language setting is not - * specified. - * - * @return void - */ - public function testLanguageSettingNotSet() - { - try { - $this->plugin->onLoad(); - $this->fail('Expected exception was not thrown'); - } catch (Phergie_Plugin_Exception $e) { - return; - } - $this->fail('Unexpected exception was thrown'); - } - - /** - * Tests for the plugin requiring the Command plugin as a dependency. - * - * @return void - */ - public function testRequiresCommandPlugin() - { - $this->setConfig('spellcheck.lang', 'en'); - $this->assertRequiresPlugin('Command'); - $this->plugin->onLoad(); - } - - /** - * Tests for the plugin failing to load because of a dictionary error. - * - * @return void - */ - public function testLoadDictionaryError() - { - $this->setConfig('spellcheck.lang', 'foo'); - try { - $this->plugin->onLoad(); - $this->fail('Expected exception not thrown'); - } catch (Phergie_Plugin_Exception $e) { - return; - } - $this->fail('Unexpected exception was thrown'); - } - - /** - * Initializes a spell check event. - * - * @param string $word Word to be checked - * - * @return void - */ - private function initializeSpellCheckEvent($word) - { - $this->setConfig('spellcheck.lang', 'en'); - $this->plugin->onLoad(); - $args = array( - 'receiver' => $this->source, - 'text' => 'spell ' . $word - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - } - - /** - * Checks for a specified response to a spell check event. - * - * @param string $word Work being checked - * @param string $response Expected response - * - * @return void - */ - private function checkForSpellCheckResponse($word, $response) - { - $this->assertEmitsEvent('privmsg', array($this->source, $response)); - $this->plugin->onCommandSpell($word); - } - - /** - * Tests for the plugin returning a response for a correctly spelled word. - * - * @return void - */ - public function testRespondsForCorrectlySpelledWord() - { - $word = 'test'; - $this->initializeSpellCheckEvent($word); - $response = $this->nick . ': The word "' . $word . '" seems to be spelled correctly.'; - $this->checkForSpellCheckResponse($word, $response); - } - - /** - * Tests for the plugin returning a response when it can't find any - * suggestions for a word. - * - * @return void - */ - public function testRespondsWithoutSuggestions() - { - $word = 'kjlfljlkjljkljlj'; - $this->initializeSpellCheckEvent($word); - $response = $this->nick . ': I could not find any suggestions for "' . $word . '".'; - $this->checkForSpellCheckResponse($word, $response); - } - - /** - * Tests for the plugin returning a response when it is able to find - * suggestions for a word. - * - * @return void - */ - public function testRespondsWithSuggestions() - { - $word = 'teh'; - $this->initializeSpellCheckEvent($word); - $response = $this->nick . ': Suggestions for "' . $word . '": the, Te, tech, Th, eh.'; - $this->checkForSpellCheckResponse($word, $response); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TerryChayTest.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TerryChayTest.php deleted file mode 100644 index e58ac6f290..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TerryChayTest.php +++ /dev/null @@ -1,135 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for Pherge_Plugin_TerryChay. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_TerryChayTest extends Phergie_Plugin_TestCase -{ - /** - * Chayism used as a consistent response when related events are - * triggered - * - * @var string - */ - private $chayism = 'Terry Chay doesn\'t need a framework; he already knows everyone\'s code'; - - /** - * Configures the mock plugin handler to return a mock Http plugin with - * a mock response object populated with predetermined content. - * - * @return void - */ - public function setUpHttpClient() - { - $response = $this->getMock('Phergie_Plugin_Http_Response'); - $response - ->expects($this->any()) - ->method('getContent') - ->will($this->returnValue($this->chayism)); - - $plugin = $this->getMock('Phergie_Plugin_Http'); - $plugin - ->expects($this->any()) - ->method('get') - ->will($this->returnValue($response)); - - $this->getMockPluginHandler() - ->expects($this->any()) - ->method('getPlugin') - ->with('Http') - ->will($this->returnValue($plugin)); - } - - /** - * Tests that the plugin requires the Http plugin as a dependency. - * - * @return void - */ - public function testRequiresHttpPlugin() - { - $this->assertRequiresPlugin('Http'); - $this->plugin->onLoad(); - } - - /** - * Data provider for testPrivmsgTriggerReturnsChayism(). - * - * @return array Enumerated array of enumerated arrays each containing - * a set of parameters for a single call to - * testPrivmsgTriggerReturnsChayism() - */ - public function dataProviderTestPrivmsgTriggerReturnsChayism() - { - return array( - array('terry chay'), - array('terry chay'), - array('tychay'), - array('!tychay'), - array('! tychay'), - array('foo tychay bar'), - ); - } - - /** - * Tests that appropriate triggers result in a response with a Chayism. - * - * @return void - * @dataProvider dataProviderTestPrivmsgTriggerReturnsChayism - */ - public function testPrivmsgTriggerReturnsChayism($trigger) - { - $this->setConfig('command.prefix', '!'); - $this->setUpHttpClient(); - $args = array( - 'receiver' => $this->source, - 'text' => $trigger - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - $this->assertEmitsEvent('privmsg', array($this->source, 'Fact: ' . $this->chayism)); - $this->plugin->onPrivmsg(); - } - - /** - * Tests that lack of an appropriate trigger results in no response with - * a Chayism. - * - * @return void - */ - public function testNoPrivmsgTriggerDoesNotReturnChayism() - { - $args = array( - 'receiver' => $this->source, - 'text' => 'foo bar baz' - ); - $event = $this->getMockEvent('privmsg', $args); - $this->plugin->setEvent($event); - $this->assertDoesNotEmitEvent('privmsg', array($this->source, 'Fact: ' . $this->chayism)); - $this->plugin->onPrivmsg(); - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestCase.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestCase.php deleted file mode 100644 index 941e7cb410..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestCase.php +++ /dev/null @@ -1,435 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Unit test suite for plugin classes. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -abstract class Phergie_Plugin_TestCase extends PHPUnit_Framework_TestCase -{ - /** - * Mock configuration - * - * @var Phergie_Config - */ - protected $config; - - /** - * Associative array for configuration setting values, accessed by the - * mock configuration object using a callback - * - * @var array - */ - protected $settings = array(); - - /** - * Mock connection - * - * @var Phergie_Connection - */ - protected $connection; - - /** - * Mock event handler - * - * @var Phergie_Event_Handler - */ - protected $events; - - /** - * Mock plugin handler - * - * @var Phergie_Plugin_Handler - */ - protected $plugins; - - /** - * Plugin instance being tested - * - * @var Phergie_Plugin_Abstract - */ - protected $plugin; - - /** - * Full name of the plugin class being tested, may be explicitly - * specified in subclasses but is otherwise automatically derived from - * the test case class name - * - * @var string - */ - protected $pluginClass; - - /** - * User nick used in any events requiring one - * - * @var string - */ - protected $nick = 'nick'; - - /** - * Event source used in any events requiring one - * - * @var string - */ - protected $source = '#channel'; - - /** - * Initializes instance properties. - * - * @return void - */ - public function setUp() - { - if (empty($this->pluginClass)) { - $this->pluginClass = preg_replace('/Test$/', '', get_class($this)); - } - - if (empty($this->plugin)) { - $this->plugin = new $this->pluginClass; - } - - $this->plugin->setConfig($this->getMockConfig()); - $this->plugin->setConnection($this->getMockConnection()); - $this->plugin->setEventHandler($this->getMockEventHandler()); - $this->plugin->setPluginHandler($this->getMockPluginHandler()); - } - - /** - * Destroys all initialized instance properties. - * - * @return void - */ - public function tearDown() - { - unset( - $this->plugins, - $this->events, - $this->connection, - $this->config, - $this->plugin - ); - } - - /** - * Returns a mock configuration object. - * - * @return Phergie_Config - */ - protected function getMockConfig() - { - if (empty($this->config)) { - $this->config = $this->getMock('Phergie_Config', array('offsetExists', 'offsetGet')); - $this->config - ->expects($this->any()) - ->method('offsetExists') - ->will($this->returnCallback(array($this, 'configOffsetExists'))); - $this->config - ->expects($this->any()) - ->method('offsetGet') - ->will($this->returnCallback(array($this, 'configOffsetGet'))); - } - return $this->config; - } - - /** - * Returns whether a specific configuration setting has a value. Only - * intended for use by this class, but must be public for PHPUnit to - * call them. - * - * @param string $name Name of the setting - * - * @return boolean TRUE if the setting has a value, FALSE otherwise - */ - public function configOffsetExists($name) - { - return isset($this->settings[$name]); - } - - /** - * Returns the value of a specific configuration setting. Only intended - * for use by this class, but must be public for PHPUnit to call them. - * - * @param string $name Name of the setting - * - * @return mixed Value of the setting - */ - public function configOffsetGet($name) - { - return $this->settings[$name]; - } - - /** - * Returns a mock connection object. - * - * @return Phergie_Connection - */ - protected function getMockConnection() - { - if (empty($this->connection)) { - $this->connection = $this->getMock('Phergie_Connection'); - $this->connection - ->expects($this->any()) - ->method('getNick') - ->will($this->returnValue($this->nick)); - } - return $this->connection; - } - - /** - * Returns a mock event handler object. - * - * @return Phergie_Event_Handler - */ - protected function getMockEventHandler() - { - if (empty($this->events)) { - $this->events = $this->getMock('Phergie_Event_Handler', array('addEvent')); - } - return $this->events; - } - - /** - * Returns a mock plugin handler object. - * - * @return Phergie_Plugin_Handler - */ - protected function getMockPluginHandler() - { - if (empty($this->plugins)) { - $config = $this->getMockConfig(); - $events = $this->getMockEventHandler(); - $this->plugins = $this->getMock( - 'Phergie_Plugin_Handler', - array(), // mock everything - array($config, $events) - ); - } - return $this->plugins; - } - - /** - * Returns a mock event object. - * - * @param string $type Event type - * @param array $args Optional associative array of event arguments - * @param string $nick Optional user nick to associate with the event - * @param string $source Optional user nick or channel name to associate - * with the event as its source - * - * @return Phergie_Event_Request - */ - protected function getMockEvent($type, array $args = array(), - $nick = null, $source = null - ) { - $methods = array('getNick', 'getSource'); - foreach (array_keys($args) as $arg) { - if (is_int($arg) || ctype_digit($arg)) { - $methods[] = 'getArgument'; - } else { - $methods[] = 'get' . ucfirst($arg); - } - } - - $event = $this->getMock( - 'Phergie_Event_Request', - $methods - ); - - $nick = $nick ? $nick : $this->nick; - $event - ->expects($this->any()) - ->method('getNick') - ->will($this->returnValue($nick)); - - $source = $source ? $source : $this->source; - $event - ->expects($this->any()) - ->method('getSource') - ->will($this->returnValue($source)); - - foreach ($args as $key => $value) { - if (is_int($key) || ctype_digit($key)) { - $event - ->expects($this->any()) - ->method('getArgument') - ->with($key) - ->will($this->returnValue($value)); - } else { - $event - ->expects($this->any()) - ->method('get' . ucfirst($key)) - ->will($this->returnValue($value)); - } - } - - return $event; - } - - /** - * Sets the value of a configuration setting. - * - * @param string $setting Name of the setting - * @param mixed $value Value for the setting - * - * @return void - */ - protected function setConfig($setting, $value) - { - $this->settings[$setting] = $value; - } - - /** - * Returns the absolute path to the Phergie/Plugin directory. Useful in - * conjunction with getMockDatabase(). - * - * @param string $subpath Optional path to append to the directory path - * - * @return string Directory path - */ - protected function getPluginsPath($subpath = null) - { - $path = realpath(dirname(__FILE__) . '/../../../Phergie/Plugin'); - if (!empty($subpath)) { - $path .= '/' . ltrim($subpath, '/'); - } - return $path; - } - - /** - * Modifies the event handler to include an expectation of an event - * being added by the plugin being tested. Note that this must be called - * BEFORE executing the plugin code intended to initiate the event. - * - * @param string $type Event type - * @param array $args Optional enumerated array of event arguments - * - * @return void - */ - protected function assertEmitsEvent($type, array $args = array()) - { - $this->events - ->expects($this->at(0)) - ->method('addEvent') - ->with($this->plugin, $type, $args); - } - - /** - * Modifies the event handler to include an expectation of an event NOT - * being added by the plugin being tested. Note that this must be called - * BEFORE executing plugin code that may initiate the event. - * - * @param string $type Event type - * @param array $args Optional enumerated array of event arguments - * - * @return void - */ - protected function assertDoesNotEmitEvent($type, array $args = array()) - { - // Ugly hack to get around an issue in PHPUnit - // @link http://github.com/sebastianbergmann/phpunit-mock-objects/issues/issue/5#issue/5/comment/343524 - $callback = create_function( - '$plugin, $type, $args', - 'if (get_class($plugin) == "' . $this->pluginClass . '" - && $type == "' . $type . '" - && $args == "' . var_export($args, true) . '") { - trigger_error("Instance of ' . $this->pluginClass - . ' unexpectedly emitted event of type ' . $type - . '", E_USER_ERROR); - }' - ); - - $this->events - ->expects($this->any()) - ->method('addEvent') - ->will($this->returnCallback($callback)); - } - - /** - * Modifies the plugin handler to include an expectation of a plugin - * being retrieved, indicating a dependency. Note that this must be - * called BEFORE executing the plugin code that may load that plugin - * dependency, which is usually located in onLoad(). - * - * @param string $name Short name of the plugin required as a dependency - * - * @return void - */ - public function assertRequiresPlugin($name) - { - $this->plugins - ->expects($this->atLeastOnce()) - ->method('getPlugin') - ->with($name); - } - - /** - * Creates an in-memory copy of a specified SQLite database file and - * returns a connection to it. - * - * @param string $path Path to the SQLite file to copy - * - * @return PDO Connection to the database copy - */ - public function getMockDatabase($path) - { - $original = new PDO('sqlite:' . $path); - $copy = new PDO('sqlite::memory:'); - - $result = $original->query('SELECT sql FROM sqlite_master'); - while ($sql = $result->fetchColumn()) { - $copy->exec($sql); - } - - $tables = array(); - $result = $original->query('SELECT name FROM sqlite_master WHERE type = "table"'); - while ($table = $result->fetchColumn()) { - $tables[] = $table; - } - - foreach ($tables as $table) { - $result = $original->query('SELECT * FROM ' . $table); - $insert = null; - $copy->beginTransaction(); - while ($row = $result->fetch(PDO::FETCH_ASSOC)) { - $columns = array_keys($row); - if (empty($insert)) { - $insert = $copy->prepare( - 'INSERT INTO "' . $table . '" (' . - '"' . implode('", "', $columns) . '"' . - ') VALUES (' . - ':' . implode(', :', $columns) . - ')' - ); - } - $insert->execute($row); - } - $copy->commit(); - unset($insert); - } - - return $copy; - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestNonInstantiablePluginFromFile.php b/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestNonInstantiablePluginFromFile.php deleted file mode 100755 index f9bddd1516..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/Phergie/Plugin/TestNonInstantiablePluginFromFile.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -/** - * Creates a plugin on the filesystem that can be used by - * Phergie_Plugin_Handler's addPath utility to be located and loaded. - * - * @category Phergie - * @package Phergie_Tests - * @author Phergie Development Team - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ -class Phergie_Plugin_TestNonInstantiablePluginFromFile -extends Phergie_Plugin_Abstract -{ - /** - * Private constructor to ensure that this class is not instantiable. - * - * @return void - */ - private function __construct() - { - } -} diff --git a/plugins/Irc/extlib/phergie/Tests/TestHelper.php b/plugins/Irc/extlib/phergie/Tests/TestHelper.php deleted file mode 100644 index e70af44562..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/TestHelper.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie_Tests - */ - -error_reporting(E_ALL | E_STRICT); - -// Phergie components require Phergie_Autoload to function correctly. -require_once dirname(__FILE__) . '/../Phergie/Autoload.php'; -Phergie_Autoload::registerAutoloader(); diff --git a/plugins/Irc/extlib/phergie/Tests/phpunit.xml b/plugins/Irc/extlib/phergie/Tests/phpunit.xml deleted file mode 100644 index b96589e4a1..0000000000 --- a/plugins/Irc/extlib/phergie/Tests/phpunit.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - ./ - - diff --git a/plugins/Irc/extlib/phergie/build.xml b/plugins/Irc/extlib/phergie/build.xml deleted file mode 100644 index 7510c75a15..0000000000 --- a/plugins/Irc/extlib/phergie/build.xml +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/Irc/extlib/phergie/phergie.bat b/plugins/Irc/extlib/phergie/phergie.bat deleted file mode 100644 index 4eec11d5c7..0000000000 --- a/plugins/Irc/extlib/phergie/phergie.bat +++ /dev/null @@ -1,14 +0,0 @@ -@echo off -REM Phergie -REM -REM PHP version 5 -REM -REM LICENSE -REM -REM This source file is subject to the new BSD license that is bundled -REM with this package in the file LICENSE. -REM It is also available through the world-wide-web at this URL: -REM http://phergie.org/license - -set PHPBIN="@php_bin@" -%PHPBIN% "@bin_dir@\phergie" %* diff --git a/plugins/Irc/extlib/phergie/phergie.php b/plugins/Irc/extlib/phergie/phergie.php deleted file mode 100755 index f0b9f6ced5..0000000000 --- a/plugins/Irc/extlib/phergie/phergie.php +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2008-2010 Phergie Development Team (http://phergie.org) - * @license http://phergie.org/license New BSD License - * @link http://pear.phergie.org/package/Phergie - */ - -/** - * @see Phergie_Autoload - */ -require 'Phergie/Autoload.php'; -Phergie_Autoload::registerAutoloader(); - -$bot = new Phergie_Bot; - -if (!isset($argc)) { - echo - 'The PHP setting register_argc_argv must be enabled for Phergie ', - 'configuration files to be specified using command line arguments; ', - 'defaulting to Settings.php in the current working directory', - PHP_EOL; -} else if ($argc > 0) { - // Skip the current file for manual installations - // ex: php phergie.php Settings.php - if (realpath($argv[0]) == __FILE__) { - array_shift($argv); - } - - // If configuration files were specified, override default behavior - if (count($argv) > 0) { - $config = new Phergie_Config; - foreach ($argv as $file) { - $config->read($file); - } - $bot->setConfig($config); - } -} - -$bot->run(); diff --git a/plugins/Irc/lib/channelresponsechannel.php b/plugins/Irc/lib/channelresponsechannel.php deleted file mode 100644 index 3ddad28aa9..0000000000 --- a/plugins/Irc/lib/channelresponsechannel.php +++ /dev/null @@ -1,61 +0,0 @@ -. - * - * @category Network - * @package StatusNet - * @author Luke Fitzgerald - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -class ChannelResponseChannel extends IMChannel { - protected $ircChannel; - - /** - * Construct a ChannelResponseChannel - * - * @param IMplugin $imPlugin IMPlugin - * @param string $ircChannel IRC Channel to reply to - * @return ChannelResponseChannel - */ - public function __construct($imPlugin, $ircChannel) { - $this->ircChannel = $ircChannel; - parent::__construct($imPlugin); - } - - /** - * Send a message using the plugin - * - * @param User $user User - * @param string $text Message text - * @return void - */ - public function output($user, $text) { - $text = $user->nickname.': ['.common_config('site', 'name') . '] ' . $text; - $this->imPlugin->sendMessage($this->ircChannel, $text); - } -} diff --git a/plugins/Irc/lib/fakeirc.php b/plugins/Irc/lib/fakeirc.php deleted file mode 100644 index ea5e433d75..0000000000 --- a/plugins/Irc/lib/fakeirc.php +++ /dev/null @@ -1,47 +0,0 @@ -. - * - * @category Network - * @package StatusNet - * @author Luke Fitzgerald - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -class FakeIrc extends Phergie_Driver_Streams { - public $would_be_sent = null; - - /** - * Store the components for sending a command - * - * @param string $command Command - * @param array $args Arguments - * @return void - */ - protected function send($command, $args = '') { - $this->would_be_sent = array('command' => $command, 'args' => $args); - } -} diff --git a/plugins/Irc/lib/ircmanager.php b/plugins/Irc/lib/ircmanager.php deleted file mode 100644 index 021fe190e3..0000000000 --- a/plugins/Irc/lib/ircmanager.php +++ /dev/null @@ -1,357 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -/** - * IRC background connection manager for IRC-using queue handlers, - * allowing them to send outgoing messages on the right connection. - * - * Input is handled during socket select loop, Any incoming messages will be handled. - * - * In a multi-site queuedaemon.php run, one connection will be instantiated - * for each site being handled by the current process that has IRC enabled. - */ -class IrcManager extends ImManager { - protected $conn = null; - protected $lastPing = null; - protected $messageWaiting = true; - protected $lastMessage = null; - - protected $regChecks = array(); - protected $regChecksLookup = array(); - - protected $connected = false; - - /** - * Initialize connection to server. - * - * @return boolean true on success - */ - public function start($master) { - if (parent::start($master)) { - $this->connect(); - return true; - } else { - return false; - } - } - - /** - * Return any open sockets that the run loop should listen - * for input on. - * - * @return array Array of socket resources - */ - public function getSockets() { - $this->connect(); - if ($this->conn) { - return $this->conn->getSockets(); - } else { - return array(); - } - } - - /** - * Request a maximum timeout for listeners before the next idle period. - * - * @return integer Maximum timeout - */ - public function timeout() { - if ($this->messageWaiting) { - return 1; - } else { - return $this->plugin->pinginterval; - } - } - - /** - * Idle processing for io manager's execution loop. - * - * @return void - */ - public function idle() { - // Send a ping if necessary - if (empty($this->lastPing) || time() - $this->lastPing > $this->plugin->pinginterval) { - $this->sendPing(); - } - - if ($this->connected) { - // Send a waiting message if appropriate - if ($this->messageWaiting && time() - $this->lastMessage > 1) { - $wm = Irc_waiting_message::top(); - if ($wm === NULL) { - $this->messageWaiting = false; - return; - } - - $data = unserialize($wm->data); - $wm->incAttempts(); - - if ($this->send_raw_message($data)) { - $wm->delete(); - } else { - if ($wm->attempts <= common_config('queue', 'max_retries')) { - // Try again next idle - $wm->releaseClaim(); - } else { - // Exceeded the maximum number of retries - $wm->delete(); - } - } - } - } - } - - /** - * Process IRC events that have come in over the wire. - * - * @param resource $socket Socket to handle input on - * @return void - */ - public function handleInput($socket) { - common_log(LOG_DEBUG, 'Servicing the IRC queue.'); - $this->stats('irc_process'); - - try { - $this->conn->handleEvents(); - } catch (Phergie_Driver_Exception $e) { - $this->connected = false; - $this->conn->reconnect(); - } - } - - /** - * Initiate connection - * - * @return void - */ - public function connect() { - if (!$this->conn) { - $this->conn = new Phergie_StatusnetBot; - - $config = new Phergie_Config; - $config->readArray( - array( - 'connections' => array( - array( - 'host' => $this->plugin->host, - 'port' => $this->plugin->port, - 'username' => $this->plugin->username, - 'realname' => $this->plugin->realname, - 'nick' => $this->plugin->nick, - 'password' => $this->plugin->password, - 'transport' => $this->plugin->transporttype, - 'encoding' => $this->plugin->encoding - ) - ), - - 'driver' => 'statusnet', - - 'processor' => 'async', - 'processor.options' => array('sec' => 0, 'usec' => 0), - - 'plugins' => array( - 'Pong', - 'NickServ', - 'AutoJoin', - 'Statusnet', - ), - - 'plugins.autoload' => true, - - // Uncomment to enable debugging output - //'ui.enabled' => true, - - 'nickserv.password' => $this->plugin->nickservpassword, - 'nickserv.identify_message' => $this->plugin->nickservidentifyregexp, - - 'autojoin.channels' => $this->plugin->channels, - - 'statusnet.messagecallback' => array($this, 'handle_irc_message'), - 'statusnet.regcallback' => array($this, 'handle_reg_response'), - 'statusnet.connectedcallback' => array($this, 'handle_connected'), - 'statusnet.unregregexp' => $this->plugin->unregregexp, - 'statusnet.regregexp' => $this->plugin->regregexp - ) - ); - - $this->conn->setConfig($config); - $this->conn->connect(); - $this->lastPing = time(); - $this->lastMessage = time(); - } - return $this->conn; - } - - /** - * Called via a callback when a message is received - * Passes it back to the queuing system - * - * @param array $data Data - * @return boolean - */ - public function handle_irc_message($data) { - $this->plugin->enqueueIncomingRaw($data); - return true; - } - - /** - * Called via a callback when NickServ responds to - * the bots query asking if a nick is registered - * - * @param array $data Data - * @return void - */ - public function handle_reg_response($data) { - // Retrieve data - $screenname = $data['screenname']; - $nickdata = $this->regChecks[$screenname]; - $usernick = $nickdata['user']->nickname; - - if (isset($this->regChecksLookup[$usernick])) { - if ($data['registered']) { - // Send message - $this->plugin->sendConfirmationCode($screenname, $nickdata['code'], $nickdata['user'], true); - } else { - // TRANS: Message given when using an unregistered IRC nickname. - $this->plugin->sendMessage($screenname, _m('Your nickname is not registered so IRC connectivity cannot be enabled.')); - - $confirm = new Confirm_address(); - - $confirm->user_id = $user->id; - $confirm->address_type = $this->plugin->transport; - - if ($confirm->find(true)) { - $result = $confirm->delete(); - - if (!$result) { - common_log_db_error($confirm, 'DELETE', __FILE__); - // TRANS: Server error thrown on database error when deleting IRC nickname confirmation. - throw new ServerException(_m('Could not delete confirmation.')); - } - } - } - - // Unset lookup value - unset($this->regChecksLookup[$usernick]); - - // Unset data - unset($this->regChecks[$screename]); - } - } - - /** - * Called when the connection is established - * - * @return void - */ - public function handle_connected() { - $this->connected = true; - } - - /** - * Enters a message into the database for sending when ready - * - * @param string $command Command - * @param array $args Arguments - * @return boolean - */ - protected function enqueue_waiting_message($data) { - $wm = new Irc_waiting_message(); - - $wm->data = serialize($data); - $wm->prioritise = $data['prioritise']; - $wm->attempts = 0; - $wm->created = common_sql_now(); - $result = $wm->insert(); - - if (!$result) { - common_log_db_error($wm, 'INSERT', __FILE__); - // TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. - throw new ServerException(_m('Database error inserting IRC waiting queue item.')); - } - - return true; - } - - /** - * Send a message using the daemon - * - * @param $data Message data - * @return boolean true on success - */ - public function send_raw_message($data) { - $this->connect(); - if (!$this->conn) { - return false; - } - - if ($data['type'] != 'delayedmessage') { - if ($data['type'] != 'message') { - // Nick checking - $nickdata = $data['nickdata']; - $usernick = $nickdata['user']->nickname; - $screenname = $nickdata['screenname']; - - // Cancel any existing checks for this user - if (isset($this->regChecksLookup[$usernick])) { - unset($this->regChecks[$this->regChecksLookup[$usernick]]); - } - - $this->regChecks[$screenname] = $nickdata; - $this->regChecksLookup[$usernick] = $screenname; - } - - // If there is a backlog or we need to wait, queue the message - if ($this->messageWaiting || time() - $this->lastMessage < 1) { - $this->enqueue_waiting_message( - array( - 'type' => 'delayedmessage', - 'prioritise' => $data['prioritise'], - 'data' => $data['data'] - ) - ); - $this->messageWaiting = true; - return true; - } - } - - try { - $this->conn->send($data['data']['command'], $data['data']['args']); - } catch (Phergie_Driver_Exception $e) { - $this->connected = false; - $this->conn->reconnect(); - return false; - } - - $this->lastMessage = time(); - return true; - } - - /** - * Sends a ping - * - * @return void - */ - protected function sendPing() { - $this->lastPing = time(); - $this->conn->send('PING', $this->lastPing); - } -} diff --git a/plugins/Irc/locale/Irc.pot b/plugins/Irc/locale/Irc.pot deleted file mode 100644 index 5a4abaea28..0000000000 --- a/plugins/Irc/locale/Irc.pot +++ /dev/null @@ -1,83 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#. TRANS: Service name for IRC. -#: IrcPlugin.php:79 -msgid "IRC" -msgstr "" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#: IrcPlugin.php:296 -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -#: IrcPlugin.php:346 -msgid "You must specify a host." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -#: IrcPlugin.php:350 -msgid "You must specify a username." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -#: IrcPlugin.php:354 -msgid "You must specify a \"real name\"." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -#: IrcPlugin.php:358 -msgid "You must specify a nickname." -msgstr "" - -#. TRANS: Plugin description. -#: IrcPlugin.php:401 -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#: Irc_waiting_message.php:130 -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -#: ircmanager.php:234 -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -#: ircmanager.php:247 -msgid "Could not delete confirmation." -msgstr "" - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -#: ircmanager.php:289 -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/ca/LC_MESSAGES/Irc.po b/plugins/Irc/locale/ca/LC_MESSAGES/Irc.po deleted file mode 100644 index 70819f3d28..0000000000 --- a/plugins/Irc/locale/ca/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of StatusNet - Irc to Catalan (catalร ) -# Exported from translatewiki.net -# -# Author: Toniher -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:54+0000\n" -"Language-Team: Catalan \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: ca\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"L'usuari ยซ%1$sยป a %2$s diu que el vostre nom %3$s li pertany. Si aixรฒ fos " -"veritat, podeu confirmar-ho clicant a l'URL: %4$s . (Si no podeu clicar-hi, " -"copieu-la i enganxeu-la a la barra d'ubicaciรณ del vostre navegador). Si no " -"fรณssiu aquest usuari, o bรฉ si no heu solยทlicitat aquesta confirmaciรณ, " -"simplement ignoreu el missatge." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Heu d'especificar un servidor central." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Heu d'especificar un nom d'usuari." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Heu d'especificar un ยซnom realยป." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Heu d'especificar un sobrenom." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"El connector IRC permet als usuaris enviar i rebre avisos des d'una xarxa " -"IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "No s'ha pogut eliminar la confirmaciรณ." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/de/LC_MESSAGES/Irc.po b/plugins/Irc/locale/de/LC_MESSAGES/Irc.po deleted file mode 100644 index 1ed8c11ea6..0000000000 --- a/plugins/Irc/locale/de/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of StatusNet - Irc to German (Deutsch) -# Exported from translatewiki.net -# -# Author: Giftpflanze -# Author: MF-Warburg -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:54+0000\n" -"Language-Team: German \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: de\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"Benutzer โ€ž%1$sโ€œ auf %2$s sagt, dass dein Benutzername auf %3$s ihm gehรถrt. " -"Wenn das richtig ist, kannst du dies bestรคtigen, indem du auf diesen Link " -"klickst: %4$s . (Wenn du ihn nicht anklicken kannst, kopieren ihn in die " -"Adressleiste deines Browsers). Wenn du nicht dieser Benutzer bist, oder du " -"diese Bestรคtigung nicht angefragt hast, ignoriere diese Nachricht einfach." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Du musst einen Host angeben." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Du musst einen Benutzernamen angeben." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Du musst einen \"echten Namen\" angeben." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Du musst einen Nick angeben." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Das IRC-Plugin erlaubt es Benutzern Nachrichten รผber ein IRC-Netwerk zu " -"senden und zu empfangen." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Konnte Versuchszรคhler fรผr %d nicht erhรถhen." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Dein Nick ist nicht registriert, sodass die IRC-Verbindung nicht hergestellt " -"werden kann." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Konnte Bestรคtigung nicht lรถschen." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "Beim Einfรผgen des IRC-Queueitems ist ein Datenbankfehler aufgetreten." diff --git a/plugins/Irc/locale/es/LC_MESSAGES/Irc.po b/plugins/Irc/locale/es/LC_MESSAGES/Irc.po deleted file mode 100644 index d05279f2d1..0000000000 --- a/plugins/Irc/locale/es/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,84 +0,0 @@ -# Translation of StatusNet - Irc to Spanish (espaรฑol) -# Exported from translatewiki.net -# -# Author: Armando-Martin -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:54+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"El usuario \"%1$s\" de %2$s ha dicho que su pseudรณnimo %3$s le pertenece. " -"Si eso es cierto, puede confirmarlo haciendo clic en esta direcciรณn URL: %4" -"$s . (Si no puede hacer clic en esa direcciรณn, cรณpiela y pรฉguela en la " -"barra de direcciones del navegador). Si el usuario no es usted, o si no " -"pidiรณ esta confirmaciรณn, simplemente ignore este mensaje." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Debe especificar un servidor (host)." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Debe especificar un nombre de usuario." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Debe especificar un \"nombre real\"." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Debe especificar un alias." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"El complemento (plugin) IRC permite a los usuarios enviar y recibir mensajes " -"mediante una red IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "No se pudo incrementar el nรบmero de intentos de %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Su pseudรณnimo (nickname) no estรก registrado, por lo que no se puede " -"habilitar la conectividad IRC." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "No se pudo eliminar la confirmaciรณn." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Error de base de datos al insertar un elemento en la cola de espera de IRC." diff --git a/plugins/Irc/locale/eu/LC_MESSAGES/Irc.po b/plugins/Irc/locale/eu/LC_MESSAGES/Irc.po deleted file mode 100644 index 84e9a790d9..0000000000 --- a/plugins/Irc/locale/eu/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,80 +0,0 @@ -# Translation of StatusNet - Irc to Basque (euskara) -# Exported from translatewiki.net -# -# Author: Artsuaga -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:54+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"%2$s guneko %1$s erabiltzaileak %3$s izena berea dela dio. Egia bada, URL " -"honetan klik eginda baiezta dezakezu: %4$s . (Ezin baduzu klik egin, kopiatu " -"eta zure nabigatzailearen helbide barran itsatsi). Erailtzaile hori zu ez " -"bazara, edo ez baduzu baieztapen-eskaririk egin, ez egin jaramonik mezu honi." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Host bat zehaztu behar duzu." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Erabiltzaile izen bat zehaztu behar duzu." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Benetako izen bat zehaztu behar duzu." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Ezizen bat zehaztu behar duzu." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"IRC pluginak erabiltzaileei IRC sare bidez oharrak bidali eta jasotzen uzten " -"die." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Ezin izan da gehitu %d(r)entzako saiakera kopurua." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "Zure ezizena erregistraturik ez dagoenez IRC koneksioa ezin da gaitu." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Ezin izan da baieztapena ezabatu." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "Datubase akatsa IRC itxarote zerrendan elementu bat gehitzean." diff --git a/plugins/Irc/locale/fi/LC_MESSAGES/Irc.po b/plugins/Irc/locale/fi/LC_MESSAGES/Irc.po deleted file mode 100644 index 107acd1a89..0000000000 --- a/plugins/Irc/locale/fi/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,83 +0,0 @@ -# Translation of StatusNet - Irc to Finnish (Suomi) -# Exported from translatewiki.net -# -# Author: Nike -# Author: XTL -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-27 12:36+0000\n" -"PO-Revision-Date: 2011-04-27 12:37:25+0000\n" -"Language-Team: Finnish \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-04-17 22:40:37+0000\n" -"X-Generator: MediaWiki 1.18alpha (r87008); Translate extension (2011-04-26)\n" -"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -"X-Language-Code: fi\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "" - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"IRC-liitรคnnรคinen mahdollistaa viestien lรคhettรคmisen ja vastaanottamisen IRC-" -"verkkoa kรคyttรคen." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -#, fuzzy -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"IRC-nimimerkkiรคsi ei ole rekisterรถity, joten IRC-yhteyttรค ei voida ottaa " -"kรคyttรถรถn" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "" - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/fr/LC_MESSAGES/Irc.po b/plugins/Irc/locale/fr/LC_MESSAGES/Irc.po deleted file mode 100644 index 39971df856..0000000000 --- a/plugins/Irc/locale/fr/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,93 +0,0 @@ -# Translation of StatusNet - Irc to French (franรงais) -# Exported from translatewiki.net -# -# Author: Coyau -# Author: Gomoko -# Author: Hashar -# Author: IAlex -# Author: Od1n -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:54+0000\n" -"Language-Team: French \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: fr\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"Lโ€™utilisateur \"%1$s\" sur %2$s a dรฉclarรฉ que votre nom affichรฉ %3$s lui " -"appartient. Si c'est le cas, vous pouvez le confirmer en cliquant sur cette " -"URL: %4$s. (Si vous ne pouvez pas cliquer dessus, copiez-collez lโ€™URL dans " -"la barre dโ€™adresse de votre navigateur). Si cet utilisateur nโ€™est pas vous, " -"ou si vous nโ€™avez pas vous-mรชme demandรฉ cette confirmation, veuillez " -"simplement ignorer ce message." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Vous devez indiquer un hรดte." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Vous devez indiquer un nom d'utilisateur" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Vous devez indiquer un ยซ vrai nom ยป." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Vous devez indiquer un pseudonyme." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Le plugin IRC permet aux utilisateurs d'envoyer et de recevoir des messages " -"depuis un rรฉseau IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Impossible d'augmenter le dรฉcompte de l'objet %d" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Votre pseudo n'est pas enregistrรฉ, la connexion IRC ne peut donc pas รชtre " -"activรฉe" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "ร‰chec de la suppression de la confirmation." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Erreur de base de donnรฉes lors de l'insertion d'un รฉlรฉment de file d'attente " -"IRC." diff --git a/plugins/Irc/locale/gl/LC_MESSAGES/Irc.po b/plugins/Irc/locale/gl/LC_MESSAGES/Irc.po deleted file mode 100644 index b160215150..0000000000 --- a/plugins/Irc/locale/gl/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,86 +0,0 @@ -# Translation of StatusNet - Irc to Galician (galego) -# Exported from translatewiki.net -# -# Author: Toliรฑo -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Galician \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: gl\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"O usuario \"%1$s\" de %2$s dixo que o pseudรณnimo %3$s pertรฉncelle a el ou " -"ela. Se รฉ certo, pรณdeo confirmar premendo neste enderezo URL: %4$s. (Se non " -"pode premer nel, copie e pegue o enderezo na barra de enderezos do " -"navegador.) Se ese usuario non รฉ vostede ou se non solicitou esta " -"confirmaciรณn, ignore esta mensaxe." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Cรณmpre especificar un provedor de hospedaxe." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Cรณmpre especificar un nome de usuario." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Cรณmpre especificar un nome real." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Cรณmpre especificar un alcume." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"O complemento IRC permite aos usuarios enviar e recibir mensaxes desde a " -"rede de IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Non se puido incrementar o nรบmero de intentos de %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"O seu alcume non estรก rexistrado, de modo que non se pode activar a " -"conectividade IRC." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Non se puido borrar a confirmaciรณn." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "Erro na base de datos ao inserir un elemento na cola de espera de IRC." diff --git a/plugins/Irc/locale/ia/LC_MESSAGES/Irc.po b/plugins/Irc/locale/ia/LC_MESSAGES/Irc.po deleted file mode 100644 index 2e4de9dbaa..0000000000 --- a/plugins/Irc/locale/ia/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,88 +0,0 @@ -# Translation of StatusNet - Irc to Interlingua (interlingua) -# Exported from translatewiki.net -# -# Author: McDutchie -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Interlingua \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: ia\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"Le usator \"%1$s\" de %2$s ha dicite que tu pseudonymo de %3$s pertine a " -"ille o illa. Si isto es correcte, tu pote confirmar lo con un clic super " -"iste URL: %4$s . (Si tu non pote cliccar super illo, copia-e-colla lo in le " -"barra de adresse de tu navigator del web.) Si tu non es iste usator, o si tu " -"non requestava iste confirmation, simplemente ignora iste message." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Es necessari specificar un host." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Es necessari specificar un nomine de usator." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Es necessari specificar un \"nomine real\"." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Es necessari specificar un pseudonymo." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Le plug-in de IRC permitte que usatores invia e recipe notas per un rete de " -"IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Non poteva incrementar le numero de tentativas pro %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Tu pseudonymo non es registrate, dunque le connexion a IRC non pote esser " -"activate." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Non poteva deler le confirmation." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Error del base de datos durante le insertion de un elemento in le cauda de " -"attender de IRC." diff --git a/plugins/Irc/locale/it/LC_MESSAGES/Irc.po b/plugins/Irc/locale/it/LC_MESSAGES/Irc.po deleted file mode 100644 index 2f04a1538e..0000000000 --- a/plugins/Irc/locale/it/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,85 +0,0 @@ -# Translation of StatusNet - Irc to Italian (italiano) -# Exported from translatewiki.net -# -# Author: GreenFox -# Author: Ximo17 -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"L'utente \"%1$s\" su %2$s ha detto che il tuo nome visualizzato %3$s gli " -"appartiene. Se รจ vero, puoi confermare cliccando su questa URL: %4$s . (Se " -"non riesci a cliccare, copia e incolla la URL nella barra degli indirizzi " -"del tuo browser). Se quest'utente non sei tu, o se non hai richiesto tu " -"questa conferma, ignora semplicemente questo messaggio." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "รˆ necessario specificare un host." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "รˆ necessario specificare un nome utente." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "รˆ necessario specificare un \"nome reale\"." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "รˆ necessario specificare un nickname." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Il plugin per IRC consente agli utenti di inviare e ricevere le notizie " -"tramite la rete IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Impossibile incrementare il conteggio dei tentativi per %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Il tuo nickname non รจ registrato di conseguenza la connettivitร  IRC non " -"potrร  essere attivata." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Impossibile eliminare la conferma." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Errore nel database nell'inserimento dell'oggetto della coda d'attesa su IRC." diff --git a/plugins/Irc/locale/ja/LC_MESSAGES/Irc.po b/plugins/Irc/locale/ja/LC_MESSAGES/Irc.po deleted file mode 100644 index 643790039d..0000000000 --- a/plugins/Irc/locale/ja/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,74 +0,0 @@ -# Translation of StatusNet - Irc to Japanese (ๆ—ฅๆœฌ่ชž) -# Exported from translatewiki.net -# -# Author: Shirayuki -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "ใƒ›ใ‚นใƒˆใ‚’ๆŒ‡ๅฎšใ—ใฆใใ ใ•ใ„ใ€‚" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "ใƒฆใƒผใ‚ถใƒผๅใ‚’ๆŒ‡ๅฎšใ—ใฆใใ ใ•ใ„ใ€‚" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "ใ€Œๆœฌๅใ€ใ‚’ๆŒ‡ๅฎšใ—ใฆใใ ใ•ใ„ใ€‚" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "ใƒ‹ใƒƒใ‚ฏใƒใƒผใƒ ใ‚’ๆŒ‡ๅฎšใ—ใฆใใ ใ•ใ„ใ€‚" - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "" - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/mk/LC_MESSAGES/Irc.po b/plugins/Irc/locale/mk/LC_MESSAGES/Irc.po deleted file mode 100644 index 8aa8bedcf8..0000000000 --- a/plugins/Irc/locale/mk/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,86 +0,0 @@ -# Translation of StatusNet - Irc to Macedonian (ะผะฐะบะตะดะพะฝัะบะธ) -# Exported from translatewiki.net -# -# Author: Bjankuloski06 -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Macedonian \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: mk\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"ะšะพั€ะธัะฝะธะบะพั‚ โ€ž%1$sโ€œ ะฝะฐ %2$s ะธะผะฐ ะธะทั˜ะฐะฒะตะฝะพ ะดะตะบะฐ ะ’ะฐัˆะธะพั‚ ะฟั€ะตะบะฐั€ ะฝะฐ %3$s ะต ะฒััƒัˆะฝะพัั‚ " -"ะฝะตะณะพะฒ. ะะบะพ ะพะฒะฐ ะต ะฒะธัั‚ะธะฝะฐ, ะผะพะถะตั‚ะต ะดะฐ ะฟะพั‚ะฒั€ะดะธั‚ะต ัั‚ะธัะบะฐั˜ัœะธ ะฝะฐ ะพะฒะฐะฐ URL-ะฐะดั€ะตัะฐ: %" -"4$s . (ะะบะพ ะฝะต ะผะพะถะตั‚ะต ะดะฐ ั˜ะฐ ัั‚ะธัะฝะตั‚ะต, ะฟั€ะตะบะพะฟะธั€ะฐั˜ั‚ะต ั˜ะฐ ะฒะพ ะฐะดั€ะตัะฝะฐั‚ะฐ ะปะตะฝั‚ะฐ ะฝะฐ " -"ะฟั€ะตะปะธัั‚ัƒะฒะฐั‡ะพั‚). ะะบะพ ะพะฒะฐ ะฝะต ัั‚ะต ะ’ะธะต, ะธะปะธ ะฐะบะพ ะฝะต ั˜ะฐ ะธะผะฐั‚ะต ะฟะพะฑะฐั€ะฐะฝะพ ะพะฒะฐะฐ " -"ะฟะพั‚ะฒั€ะดะฐ, ัะปะพะฑะพะดะฝะพ ะทะฐะฝะตะผะฐั€ะตั‚ะต ั˜ะฐ ะฟะพั€ะฐะบะฐะฒะฐ." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "ะœะพั€ะฐ ะดะฐ ะฝะฐะฒะตะดะตั‚ะต ะดะพะผะฐัœะธะฝ." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "ะœะพั€ะฐ ะดะฐ ะฝะฐะฒะตะดะตั‚ะต ะบะพั€ะธัะฝะธั‡ะบะพ ะธะผะต." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "ะœะพั€ะฐ ะดะฐ ะฝะฐะฒะตะดะตั‚ะต โ€žะฒะธัั‚ะธะฝัะบะพ ะธะผะตโ€œ." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "ะœะพั€ะฐ ะดะฐ ะฝะฐะฒะตะดะตั‚ะต ะฟั€ะตะบะฐั€." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"ะŸั€ะธะบะปัƒั‡ะพะบะพั‚ ะทะฐ IRC ะธะผ ะพะฒะพะทะผะพะถัƒะฒะฐ ะฝะฐ ะบะพั€ะธัะฝะธั†ะธั‚ะต ะดะฐ ะธัะฟั€ะฐัœะฐะฐั‚ ะธ ะฟั€ะธะผะฐะฐั‚ " -"ะทะฐะฑะตะปะตัˆะบะธ ะฟั€ะตะบัƒ ะผั€ะตะถะฐั‚ะฐ ะฝะฐ IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "ะะต ะผะพะถะตะฒ ะดะฐ ะณะพ ะดะพะฟะพะปะฝะฐะผ ะฑั€ะพั˜ะพั‚ ะฝะฐ ะพะฑะธะดะธ ะทะฐ %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"ะ’ะฐัˆะธะพั‚ ะฟั€ะตะบะฐั€ ะฝะต ะต ั€ะตะณะธัั‚ั€ะธั€ะฐะฝ, ะฟะฐ ะทะฐั‚ะพะฐ ะฝะต ะผะพะถะต ะดะฐ ัะต ะพะฒะพะทะผะพะถะธ ะฟะพะฒั€ะทัƒะฒะฐัšะตั‚ะพ " -"ัะพ IRC." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "ะะต ะผะพะถะตะฒ ะดะฐ ั˜ะฐ ะธะทะฑั€ะธัˆะฐะผ ะฟะพั‚ะฒั€ะดะฐั‚ะฐ." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "ะ“ั€ะตัˆะบะฐ ะฒะพ ะฑะฐะทะฐั‚ะฐ ะฟั€ะธ ะฒะผะตั‚ะฝัƒะฒะฐัšะตั‚ะพ ะฝะฐ ั€ะตะดะธั†ะฐั‚ะฐ ะฝะฐ ั‡ะตะบะฐัšะต ะทะฐ IRC ." diff --git a/plugins/Irc/locale/nl/LC_MESSAGES/Irc.po b/plugins/Irc/locale/nl/LC_MESSAGES/Irc.po deleted file mode 100644 index 8736972e32..0000000000 --- a/plugins/Irc/locale/nl/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,88 +0,0 @@ -# Translation of StatusNet - Irc to Dutch (Nederlands) -# Exported from translatewiki.net -# -# Author: SPQRobin -# Author: Siebrand -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Dutch \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: nl\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"Gebruiker \"%1$s\" op de site %2$s heeft aangegeven dat de schermnaam %3$s " -"van hem is. Als dat klopt, dan kunt u dit bevestigen door op deze verwijzing " -"te klikken: %4$s. Als u hier niet op kunt klikken, kopieer en plak deze " -"verwijzing naar in de adresbalk van uw webbrowser. Als u deze gebruiker niet " -"bent, of u hebt niet om deze bevestiging gevraagd, negeer dit bericht dan." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "U moet een host opgeven." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "U moet een gebruikersnaam opgeven." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "U moet een echte naam opgeven." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "U moet een gebruikersnaam opgeven." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Maakt het mogelijk om mededelingen te zenden naar en ontvangen van een IRC-" -"netwerk." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Het was niet mogelijk om het aantal pogingen voor %d op te hogen" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Uw gebruikersnaam is niet geregistreerd en daarom kan er geen koppeling met " -"IRC worden gemaakt." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "De bevestiging kon niet verwijderd worden." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Er is een databasefout opgetreden tijdens het invoegen van het IRC-queueitem." diff --git a/plugins/Irc/locale/sv/LC_MESSAGES/Irc.po b/plugins/Irc/locale/sv/LC_MESSAGES/Irc.po deleted file mode 100644 index 1d47845d92..0000000000 --- a/plugins/Irc/locale/sv/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,81 +0,0 @@ -# Translation of StatusNet - Irc to Swedish (svenska) -# Exported from translatewiki.net -# -# Author: Lokal Profil -# Author: WikiPhoenix -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Swedish \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: sv\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Du mรฅste ange en vรคrd." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Du mรฅste ange ett anvรคndarnamn." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Du mรฅste ange ett \"riktigt namn\"." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Du mรฅste ange ett smeknamn." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"IRC-tillรคgget tillรฅter anvรคndare skicka och ta emot meddelanden รถver IRC-" -"nรคtverket." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"Ditt smeknamn รคr inte registrerat, sรฅ IRC-anslutningar kan inte aktiveras." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "" - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/tl/LC_MESSAGES/Irc.po b/plugins/Irc/locale/tl/LC_MESSAGES/Irc.po deleted file mode 100644 index 45a8208d01..0000000000 --- a/plugins/Irc/locale/tl/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,87 +0,0 @@ -# Translation of StatusNet - Irc to Tagalog (Tagalog) -# Exported from translatewiki.net -# -# Author: AnakngAraw -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:55+0000\n" -"Language-Team: Tagalog \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: tl\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"Sinabi ng tagagamit na si \"%1$s\" sa %2$s na ang bansag mong %3$s ay pag-" -"aari nila. Kung iyan ay totoo, matitiyak mo sa pamamagitan ng pagpindot sa " -"URL na ito: %4$s. (Kung hindi mo ito mapindot, kopyahin at idikit ito sa " -"loob ng halang ng tirahan ng iyong pantingin-tingin). Kung hindi ikaw ang " -"tagagamit na iyan, o hindi mo hiniling ang pagtitiyak na ito, huwag na " -"lamang pansinin ang mensaheng ito." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Dapat kang tumukoy ng isang tagapagpasinaya." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Dapat kang tumukoy ng isang pangalan ng tagagamit." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "Dapat kang tumukoy ng isang \"tunay na pangalan\"." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Dapat kang tumukoy ng isang palayaw." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"Ang pampasak na IRC ay nagpapahintulot sa mga tagagamit na makapagpadala at " -"makatanggap ng mga pabatid sa ibabaw ng kalambatan ng IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "Hindi masudlungan ang bilang ng mga pagtatangka para sa %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "Hindi nakatala ang palayaw mo kaya't hindi mapagana ang ugnay ng IRC." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Hindi mabura ang pagtitiyak." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" -"Kamalian ng kalipunan ng dato sa pagsisingit ng IRD na naghihintay ng bagay " -"ng pila." diff --git a/plugins/Irc/locale/tr/LC_MESSAGES/Irc.po b/plugins/Irc/locale/tr/LC_MESSAGES/Irc.po deleted file mode 100644 index 9b9026cb54..0000000000 --- a/plugins/Irc/locale/tr/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,77 +0,0 @@ -# Translation of StatusNet - Irc to Turkish (Tรผrkรงe) -# Exported from translatewiki.net -# -# Author: Emperyan -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:56+0000\n" -"Language-Team: Turkish \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: tr\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "Bir ana bilgisayar belirtmeniz gerekir." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "Bir kullanฤฑcฤฑ adฤฑ belirtmelisiniz." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "\"Gerรงek adฤฑnฤฑzฤฑ\" belirtmelisiniz." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "Bir takma ad belirtmelisiniz." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "" - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "Onay silinemedi." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "" diff --git a/plugins/Irc/locale/uk/LC_MESSAGES/Irc.po b/plugins/Irc/locale/uk/LC_MESSAGES/Irc.po deleted file mode 100644 index 77f19689b7..0000000000 --- a/plugins/Irc/locale/uk/LC_MESSAGES/Irc.po +++ /dev/null @@ -1,86 +0,0 @@ -# Translation of StatusNet - Irc to Ukrainian (ัƒะบั€ะฐั—ะฝััŒะบะฐ) -# Exported from translatewiki.net -# -# Author: Boogie -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Irc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:08:56+0000\n" -"Language-Team: Ukrainian \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-05 21:50:23+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: uk\n" -"X-Message-Group: #out-statusnet-plugin-irc\n" -"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= " -"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" - -#. TRANS: Service name for IRC. -msgid "IRC" -msgstr "IRC" - -#. TRANS: Body text for e-mail confirmation message for IRC. -#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename, -#. TRANS: %3$s is the plugin display name ("IRC"), %4$s is the confirm address URL. -#, php-format -msgid "" -"User \"%1$s\" on %2$s has said that your %3$s screenname belongs to them. If " -"that's true, you can confirm by clicking on this URL: %4$s . (If you cannot " -"click it, copy-and-paste it into the address bar of your browser). If that " -"user is not you, or if you did not request this confirmation, just ignore " -"this message." -msgstr "" -"ะšะพั€ะธัั‚ัƒะฒะฐั‡ ยซ%1$sยป ะฝะฐ ัะฐะนั‚ั– %2$s ะฟะพะฒั–ะดะพะผะธะฒ, ั‰ะพ ะฒะฐัˆ ะฟัะตะฒะดะพะฝั–ะผ %3$s ะฝะฐะปะตะถะธั‚ัŒ " -"ะนะพะผัƒ. ะฏะบั‰ะพ ั†ะต ะดั–ะนัะฝะพ ั‚ะฐะบ, ะฒะธ ะผะพะถะตั‚ะต ะฟั–ะดั‚ะฒะตั€ะดะธั‚ะธ ั†ะต ะฟั€ะพัั‚ะพ ะฟะตั€ะตะนัˆะพะฒัˆะธ ะทะฐ " -"ะฝะฐัั‚ัƒะฟะฝะพัŽ ะปะฐะฝะบะพัŽ: %4$s. (ะฏะบั‰ะพ ะฒะธ ะฝะต ะผะพะถะตั‚ะต ะฝะฐั‚ะธัะฝัƒั‚ะธ ะฝะฐ ะฟะพัะธะปะฐะฝะฝั, ั‚ะพ " -"ัะบะพะฟั–ัŽะนั‚ะต ะฐะดั€ะตััƒ ะดะพ ะฐะดั€ะตัะฝะพะณะพ ั€ัะดะบะฐ ะฒะฐัˆะพะณะพ ะฒะตะฑ-ะพะณะปัะดะฐั‡ะฐ.) ะฏะบั‰ะพ ะฒะธ ะฝะต ั” " -"ะทะณะฐะดะฐะฝะธะผ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะตะผ, ะฝะต ะฟั–ะดั‚ะฒะตั€ะดะถัƒะนั‚ะต ะฝั–ั‡ะพะณะพ, ะฟั€ะพัั‚ะพ ะฟั€ะพั–ะณะฝะพั€ัƒะนั‚ะต ั†ะต " -"ะฟะพะฒั–ะดะพะผะปะตะฝะฝั." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a host." -msgstr "ะ’ะธ ะฟะพะฒะธะฝะฝั– ะฒะบะฐะทะฐั‚ะธ ั…ะพัั‚.." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a username." -msgstr "ะ’ะธ ะฟะพะฒะธะฝะฝั– ะทะฐะทะฝะฐั‡ะธั‚ะธ ั–ะผโ€™ั ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a \"real name\"." -msgstr "ะ’ะธ ะฟะพะฒะธะฝะฝั– ะทะฐะทะฝะฐั‡ะธั‚ะธ ยซัะฟั€ะฐะฒะถะฝั” ั–ะผโ€™ัยป." - -#. TRANS: Exception thrown when initialising the IRC plugin fails because of an incorrect configuration. -msgid "You must specify a nickname." -msgstr "ะ’ะธ ะฟะพะฒะธะฝะฝั– ะทะฐะทะฝะฐั‡ะธั‚ะธ ะฟัะตะฒะดะพะฝั–ะผ." - -#. TRANS: Plugin description. -msgid "" -"The IRC plugin allows users to send and receive notices over an IRC network." -msgstr "" -"ะ”ะพะดะฐั‚ะพะบ IRC ะดะพะทะฒะพะปัั” ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐะผ ะฝะฐะดัะธะปะฐั‚ะธ ั– ะพั‚ั€ะธะผัƒะฒะฐั‚ะธ ะดะพะฟะธัะธ ัƒ ะผะตั€ะตะถั– IRC." - -#. TRANS: Exception thrown when an IRC attempts count could not be updated. -#. TRANS: %d is the object ID for which the count could not be updated. -#, php-format -msgid "Could not increment attempts count for %d." -msgstr "ะะต ะฒะดะฐะปะพัั ะทะฑั–ะปัŒัˆะธั‚ะธ ะบั–ะปัŒะบั–ัั‚ัŒ ัะฟั€ะพะฑ ะดะปั %d." - -#. TRANS: Message given when using an unregistered IRC nickname. -msgid "Your nickname is not registered so IRC connectivity cannot be enabled." -msgstr "" -"ะ’ะฐัˆ ะฟัะตะฒะดะพะฝั–ะผ ะฝะต ะทะฐั€ะตั”ัั‚ั€ะพะฒะฐะฝะพ ั– ั‚ะพะผัƒ ะฟั–ะดะบะปัŽั‡ะตะฝะฝั ะดะพ IRC ัƒะฒั–ะผะบะฝัƒั‚ะธ ะฝะตะผะพะถะปะธะฒะพ." - -#. TRANS: Server error thrown on database error when deleting IRC nickname confirmation. -msgid "Could not delete confirmation." -msgstr "ะะต ะฒะดะฐะปะพัั ะฒะธะดะฐะปะธั‚ะธ ะฟั–ะดั‚ะฒะตั€ะดะถะตะฝะฝั." - -#. TRANS: Server exception thrown when an IRC waiting queue item could not be added to the database. -msgid "Database error inserting IRC waiting queue item." -msgstr "ะŸะพะผะธะปะบะฐ ะฑะฐะทะธ ะดะฐะฝะธั… ะฟั€ะธ ะฒัั‚ะฐะฒั†ั– ะตะปะตะผะตะฝั‚ะฐ ั‡ะตั€ะณะธ ะพั‡ั–ะบัƒะฒะฐะฝะฝั IRC." diff --git a/plugins/Spotify/SpotifyPlugin.php b/plugins/Spotify/SpotifyPlugin.php deleted file mode 100644 index 5877694e0f..0000000000 --- a/plugins/Spotify/SpotifyPlugin.php +++ /dev/null @@ -1,119 +0,0 @@ -. - * - * @category Plugin - * @package StatusNet - * @author Nick Holliday - * @copyright Nick Holliday - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - * @see Event - */ -if (!defined('STATUSNET')) { - exit(1); -} -define('SPOTIFYPLUGIN_VERSION', '0.1'); - -/** - * Plugin to create pretty Spotify URLs - * - * The Spotify API is called before the notice is saved to gather artist and track information. - * - * @category Plugin - * @package StatusNet - * @author Nick Holliday - * @copyright Nick Holliday - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - * @see Event - */ -class SpotifyPlugin extends Plugin -{ - function __construct() - { - parent::__construct(); - } - - function onStartNoticeSave($notice) - { - $notice->rendered = preg_replace_callback('/spotify:[a-z]{5,6}:[a-z0-9]{22}/i', - "renderSpotifyURILink", - $notice->rendered); - - $notice->rendered = preg_replace_callback('/http:\/\/open.spotify.com\/[a-z]{5,6}\/[a-z0-9]{22}<\/a>/i', - "renderSpotifyHTTPLink", - $notice->rendered); - - return true; - } - - function onPluginVersion(&$versions) - { - $versions[] = array('name' => 'Spotify', - 'version' => SPOTIFYPLUGIN_VERSION, - 'author' => 'Nick Holliday', - 'homepage' => 'http://status.net/wiki/Plugin:Spotify', - 'rawdescription' => - // TRANS: Plugin description. - _m('Create pretty Spotify URLs.')); - - return true; - } -} - -// @todo FIXME: This probably should not be global functions. -function doSpotifyLookup($uri, $isArtist) -{ - $request = HTTPClient::start(); - $response = $request->get('http://ws.spotify.com/lookup/1/?uri=' . $uri); - if ($response->isOk()) { - $xml = simplexml_load_string($response->getBody()); - - if($isArtist) - return $xml->name; - else - return $xml->artist->name . ' - ' . $xml->name; - } -} - -function renderSpotifyURILink($match) -{ - $isArtist = false; - if(preg_match('/artist/', $match[0]) > 0) $isArtist = true; - - $name = doSpotifyLookup($match[0], $isArtist); - return "" . $name . ""; -} - -function renderSpotifyHTTPLink($match) -{ - $match[0] = preg_replace('/http:\/\/open.spotify.com\//i', 'spotify:', $match[0]); - $match[0] = preg_replace('/<\/a>/', '', $match[0]); - $match[0] = preg_replace('/\//', ':', $match[0]); - - $isArtist = false; - if(preg_match('/artist/', $match[0]) > 0) $isArtist = true; - - $name = doSpotifyLookup($match[0], $isArtist); - return "" . $name . ""; -} diff --git a/plugins/Spotify/locale/Spotify.pot b/plugins/Spotify/locale/Spotify.pot deleted file mode 100644 index 067d910d5a..0000000000 --- a/plugins/Spotify/locale/Spotify.pot +++ /dev/null @@ -1,22 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#. TRANS: Plugin description. -#: SpotifyPlugin.php:84 -msgid "Create pretty Spotify URLs." -msgstr "" diff --git a/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po deleted file mode 100644 index 3db27433fd..0000000000 --- a/plugins/Spotify/locale/de/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,26 +0,0 @@ -# Translation of StatusNet - Spotify to German (Deutsch) -# Exported from translatewiki.net -# -# Author: ChrisiPK -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Language-Team: German \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: de\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "Schรถne Spotify-URLs erstellen." diff --git a/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po deleted file mode 100644 index b57a11f2dd..0000000000 --- a/plugins/Spotify/locale/es/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,24 +0,0 @@ -# Translation of StatusNet - Spotify to Spanish (espaรฑol) -# Exported from translatewiki.net -# -# Author: Armando-Martin -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "" -"Crear direcciones URL para Spotify." diff --git a/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po deleted file mode 100644 index 52f3ad52ec..0000000000 --- a/plugins/Spotify/locale/fr/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,23 +0,0 @@ -# Translation of StatusNet - Spotify to French (franรงais) -# Exported from translatewiki.net -# -# Author: Gomoko -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "Crรฉer de jolies URLs Spotify." diff --git a/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po deleted file mode 100644 index d9337709c0..0000000000 --- a/plugins/Spotify/locale/gl/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,27 +0,0 @@ -# Translation of StatusNet - Spotify to Galician (galego) -# Exported from translatewiki.net -# -# Author: Toliรฑo -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Language-Team: Galician \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: gl\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "" -"Crear enderezos URL para Spotify." diff --git a/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po deleted file mode 100644 index 28f1678eda..0000000000 --- a/plugins/Spotify/locale/he/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,26 +0,0 @@ -# Translation of StatusNet - Spotify to Hebrew (ืขื‘ืจื™ืช) -# Exported from translatewiki.net -# -# Author: Amire80 -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Language-Team: Hebrew \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: he\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "ื™ืฆื™ืจืช ื›ืชื•ื‘ื•ืช ื™ืคื•ืช ืœึพSpotify." diff --git a/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po deleted file mode 100644 index 3185173912..0000000000 --- a/plugins/Spotify/locale/ia/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,26 +0,0 @@ -# Translation of StatusNet - Spotify to Interlingua (interlingua) -# Exported from translatewiki.net -# -# Author: McDutchie -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Language-Team: Interlingua \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: ia\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "Crear belle URLs de Spotify." diff --git a/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po deleted file mode 100644 index b1c86f17d6..0000000000 --- a/plugins/Spotify/locale/mk/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,28 +0,0 @@ -# Translation of StatusNet - Spotify to Macedonian (ะผะฐะบะตะดะพะฝัะบะธ) -# Exported from translatewiki.net -# -# Author: Bjankuloski06 -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:06+0000\n" -"Language-Team: Macedonian \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: mk\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "" -"ะŸั€ะฐะฒะตั‚ะต ะธะฝั‚ะตั€ะตัะฝะธ ะธ ัƒะฑะฐะฒะธ URL-ะฐะดั€ะตัะธ ัะพ Spotify." diff --git a/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po deleted file mode 100644 index be97552c5f..0000000000 --- a/plugins/Spotify/locale/nl/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,26 +0,0 @@ -# Translation of StatusNet - Spotify to Dutch (Nederlands) -# Exported from translatewiki.net -# -# Author: Siebrand -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" -"Language-Team: Dutch \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: nl\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "Maak mooie Spotify-URL's." diff --git a/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po deleted file mode 100644 index fa3b155b89..0000000000 --- a/plugins/Spotify/locale/sv/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,27 +0,0 @@ -# Translation of StatusNet - Spotify to Swedish (svenska) -# Exported from translatewiki.net -# -# Author: WikiPhoenix -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" -"Language-Team: Swedish \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"X-Translation-Project: translatewiki.net \n" -"X-Language-Code: sv\n" -"X-Message-Group: #out-statusnet-plugin-spotify\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "" -"Skapa vackra Spotify-webbadresser." diff --git a/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po b/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po deleted file mode 100644 index 64c13c1fe4..0000000000 --- a/plugins/Spotify/locale/tl/LC_MESSAGES/Spotify.po +++ /dev/null @@ -1,25 +0,0 @@ -# Translation of StatusNet - Spotify to Tagalog (Tagalog) -# Exported from translatewiki.net -# -# Author: AnakngAraw -# -- -# This file is distributed under the same license as the StatusNet package. -# -msgid "" -msgstr "" -"Project-Id-Version: StatusNet - Spotify\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-30 11:07+0000\n" -"PO-Revision-Date: 2012-06-30 11:10:07+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n" -"X-Translation-Project: translatewiki.net \n" -"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. TRANS: Plugin description. -msgid "Create pretty Spotify URLs." -msgstr "" -"Lumikha ng marilag na mga URL ng Spotify." diff --git a/plugins/TinyMCE/TinyMCEPlugin.php b/plugins/TinyMCE/TinyMCEPlugin.php deleted file mode 100644 index 08da1048fc..0000000000 --- a/plugins/TinyMCE/TinyMCEPlugin.php +++ /dev/null @@ -1,348 +0,0 @@ -. - * - * @category WYSIWYG - * @package StatusNet - * @author Evan Prodromou - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ - */ -if (!defined('STATUSNET')) { - // This check helps protect against security problems; - // your code file can't be executed directly from the web. - exit(1); -} - -/** - * Use TinyMCE library to allow rich text editing in the browser - * - * Converts the notice form in browser to a rich-text editor. - * - * FIXME: this plugin DOES NOT load its static files from the configured - * plugin server if one exists. There are cross-server permissions errors - * if you try to do that (something about window.tinymce). - * - * @category WYSIWYG - * @package StatusNet - * @author Evan Prodromou - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ - */ -class TinyMCEPlugin extends Plugin -{ - var $html; - - // By default, TinyMCE editor will be available to all users. - // With restricted on, only users who have been granted the - // "richedit" role get it. - public $restricted = false; - - function onEndShowScripts($action) - { - if (common_logged_in() && $this->isAllowedRichEdit()) { - $action->script(common_path('plugins/TinyMCE/js/jquery.tinymce.js')); - $action->inlineScript($this->_inlineScript()); - } - - return true; - } - - function onEndShowStyles($action) - { - if ($this->isAllowedRichEdit()) { - $action->style('span#notice_data-text_container, span#notice_data-text_parent { float: left }'); - } - return true; - } - - function onPluginVersion(&$versions) - { - $versions[] = array('name' => 'TinyMCE', - 'version' => GNUSOCIAL_VERSION, - 'author' => 'Evan Prodromou', - 'homepage' => 'http://status.net/wiki/Plugin:TinyMCE', - 'rawdescription' => - // TRANS: Plugin description. - _m('Use TinyMCE library to allow rich text editing in the browser.')); - return true; - } - - /** - * Sanitize HTML input and strip out potentially dangerous bits. - * - * @param string $raw HTML - * @return string HTML - */ - private function sanitizeHtml($raw) - { - require_once INSTALLDIR . '/extlib/htmLawed/htmLawed.php'; - - $config = array('safe' => 1, - 'deny_attribute' => 'id,style,on*'); - - return htmLawed($raw, $config); - } - - /** - * Hook for new-notice form processing to take our HTML goodies; - * won't affect API posting etc. - * - * @param NewNoticeAction $action - * @param User $user - * @param string $content - * @param array $options - * @return boolean hook return - */ - function onStartSaveNewNoticeWeb($action, $user, &$content, &$options) - { - if ($action->arg('richedit') && $this->isAllowedRichEdit()) { - $html = $this->sanitizeHtml($content); - $options['rendered'] = $html; - $content = common_strip_html($html); - } - return true; - } - - /** - * Hook for new-notice form processing to process file upload appending... - * - * @param NewNoticeAction $action - * @param MediaFile $media - * @param string $content - * @param array $options - * @return boolean hook return - */ - function onStartSaveNewNoticeAppendAttachment($action, $media, &$content, &$options) - { - if ($action->arg('richedit') && $this->isAllowedRichEdit()) { - // See if we've got a placeholder inline image; if so, fill it! - $dom = new DOMDocument(); - - if ($dom->loadHTML($options['rendered'])) { - $imgs = $dom->getElementsByTagName('img'); - foreach ($imgs as $img) { - if (preg_match('/(^| )placeholder( |$)/', $img->getAttribute('class'))) { - // Create a link to the attachment page... - $this->formatAttachment($img, $media); - } - } - $options['rendered'] = $this->saveHtml($dom); - } - - // The regular code will append the short URL to the plaintext content. - // Carry on and let it through... - } - return true; - } - - /** - * Format the attachment placeholder img with the final version. - * - * @param DOMElement $img - * @param MediaFile $media - */ - private function formatAttachment($img, $media) - { - $parent = $img->parentNode; - $dom = $img->ownerDocument; - - $link = $dom->createElement('a'); - $link->setAttribute('href', $media->fileurl); - $link->setAttribute('title', File::url($media->filename)); - - if ($this->isEmbeddable($media)) { - // Fix the the attributes and wrap the link around it... - $this->insertImage($img, $media); - $parent->replaceChild($link, $img); //it dies in here?! - $link->appendChild($img); - } else { - // Not an image? Replace it with a text link. - $link->setAttribute('rel', 'external'); - $link->setAttribute('class', 'attachment'); - $link->setAttribute('id', 'attachment-' . $media->fileRecord->id); - $text = $dom->createTextNode($media->shortUrl()); - $link->appendChild($text); - $parent->replaceChild($link, $img); - } - } - - /** - * Is this media file a type we can display inline? - * - * @param MediaFile $media - * @return boolean - */ - private function isEmbeddable($media) - { - $showable = array('image/png', - 'image/gif', - 'image/jpeg'); - return in_array($media->mimetype, $showable); - } - - /** - * Rewrite and resize a placeholder image element to match the uploaded - * file. If the holder is smaller than the file, the file is scaled to fit - * with correct aspect ratio (but will be loaded at full resolution). - * - * @param DOMElement $img - * @param MediaFile $media - */ - private function insertImage($img, $media) - { - $img->setAttribute('src', $media->fileRecord->url); - - $holderWidth = intval($img->getAttribute('width')); - $holderHeight = intval($img->getAttribute('height')); - - $path = File::path($media->filename); - $imgInfo = getimagesize($path); - - if ($imgInfo) { - $origWidth = $imgInfo[0]; - $origHeight = $imgInfo[1]; - - list($width, $height) = $this->sizeBox( - $origWidth, $origHeight, - $holderWidth, $holderHeight); - - $img->setAttribute('width', $width); - $img->setAttribute('height', $height); - } - } - - /** - * - * @param int $origWidth - * @param int $origHeight - * @param int $holderWidth - * @param int $holderHeight - * @return array($width, $height) - */ - private function sizeBox($origWidth, $origHeight, $holderWidth, $holderHeight) - { - $holderAspect = $holderWidth / $holderHeight; - $origAspect = $origWidth / $origHeight; - if ($origAspect >= 1.0) { - // wide image - if ($origWidth > $holderWidth) { - return array($holderWidth, intval($holderWidth / $origAspect)); - } else { - return array($origWidth, $origHeight); - } - } else { - if ($origHeight > $holderHeight) { - return array(intval($holderWidth * $origAspect), $holderHeight); - } else { - return array($origWidth, $origHeight); - } - } - } - - private function saveHtml($dom) - { - $html = $dom->saveHTML(); - // hack to remove surrounding crap added to the dom - // all we wanted was a fragment - $stripped = preg_replace('/^.*]*>(.*)<\/body.*$/is', '$1', $html); - return $stripped; - } - - function _inlineScript() - { - $path = common_path('plugins/TinyMCE/js/tiny_mce.js'); - $placeholder = common_path('plugins/TinyMCE/icons/placeholder.png'); - - // Note: the normal on-submit triggering to save data from - // the HTML editor into the textarea doesn't play well with - // our AJAX form submission. Manually moving it to trigger - // on our send button click. - $scr = <<'); - - form.find('.submit:first').click(function() { - tinymce.triggerSave(); - }); - - var origCounter = SN.U.CharacterCount; - SN.U.CharacterCount = function(form) { - var text = $(ed.getDoc()).text(); - return text.length; - }; - ed.onKeyUp.add(function (ed, e) { - SN.U.Counter(noticeForm); - }); - - form.find('input[type=file]').change(function() { - var img = ''; - var html = tinyMCE.activeEditor.getContent(); - ed.setContent(html + img); - }); - } - }); - }; - })(); -END_OF_SCRIPT; - - return $scr; - } - - /** - * Does the current user have permission to use the rich-text editor? - * Always true unless the plugin's "restricted" setting is on, in which - * case it's limited to users with the "richedit" role. - * - * @fixme make that more sanely configurable :) - * - * @return boolean - */ - private function isAllowedRichEdit() - { - if ($this->restricted) { - $user = common_current_user(); - return !empty($user) && $user->hasRole('richedit'); - } else { - return true; - } - } -} diff --git a/plugins/TinyMCE/icons/placeholder.png b/plugins/TinyMCE/icons/placeholder.png deleted file mode 100644 index 911f257d50213193bf2f0ba14b07f3a0aa4b59b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78779 zcmXt9Wmps5+a9BHU;!cwL{LN=CQ6M^DHQ}2lo*KoKtV?5f>KmeK$M{%AtfS=kdBQ` z9o?|e4I?(z`}=-)&vl*aoa^~?@;UeO-1m87b=O2(+B-q+D&gF^c(Oho-xmA6$0FZn2YslHdmo4TP~?+X zBWCjO8#b-wq=y{U`vbh%X)Jw zi_6Mte^j>Q*X9*g*A`Uw{Hp5Ds~M=Q{{6FIq_knQwE0Ix!$5swU3qgwDSoI5H&lls z)Zm93n)<6czt^{PG>Gw~XUj2Jo$eRqYc^ZNts&BP|`Ht({{yLP1B@U|ZLCd-p_l z522%Hvb(pdWgxfn&s6W9(eA&~Jp^KJAL&p3Y|mIu@8HDWfw}&Hsez$B!r=Vi&`jUt z_o0!2{^7-;VdC%zX>fFTWOR0XbaHTfa%6mXY;1mDa(;Y#VSI9QVrqP1a&c&SadK*D zZ2sre%;ePc^7PEg3~_aQc8y3{BQEEYX4fa@H|FLx=jXSkm$nv`<`)*X7dCz^E|Hg( zcji~u*OoVyS9Vuc_tsZ8m)5sd*Y-Eowl>$dmp8Xpx5(R@JKKA;Yumd!TYKx|y=_YK z9+|SayT5nPxW7x?rL}GEAM80 zct2!fs$m;mz8t7JhEwuzuPXoH-tKvOL_-&~{v~hc@A0m@OCFJiQD$p*1{I-RW2K2# zskJXuZ=HTrZ-3AN@D(TDD@jyLwP6*;|Lcdr{d0-G&y@ajTC;`ebjAX2 zX~N3Dz}wav{>0@prvCEO!Jbvwr5Cfz&u1DcZ8GsM_x7|$DgLEehK~?{YTQo0vo{aZis%irz-|vDZ+e+q1E=>$9=oi|E$yG4^Hdu}1KJ z+_agZ4NK~_cR!lmXWWENK+#`; zwUo{~GesuHI0y0ij30DFE0Q%ulwyT>N%&g>R6~7_bgd9eE283c-OXYd$ zKs|+n^be@LS`Em(3dl?oCz4)9oDb&1e>BdZm#rw{eaTW|0E7xHyz2?b=L_3z7t-=I z+Ihcd3?5zM25LOYt1r+b_WVSo+urH$6KFuA4508>)QRwlvp~x^h;cfdO!FM#36C*| zs~2z~=!qHtoq7;omdT^4EGa%6iJ=*L1$%y zWRl7f!TMQO6ajtOLY8)MU*$xk82}nFbFn3ZPEtyk$G(#plKi#6BMDS&*E=Xzg-r_@ z3Ps9pk<0r@N+n%ZV<%ZPl4F&`6Ug;r5lf;`8Ij-UO(mmdb@I&o$<2TZ0{?;anD)oG zWp<`n*wnU0u^3gd>;mPgF6;K?si&Zp4E9BMrV&xXD4_`=8X?IPifGX@P*j3@SZPhg z>j|OAGcQCcSJYK#*{#Nk?4vE2FP)k-tNCC@xXBpBS=H-J@r@w@PM=ro?JH&ph_YU} z1)>P5&88$wl66WTdc#vnXcoJLAGMOwY>_+lM4HDQfID^*7s#i?ZwOH2%@9Y+AER2c z_@6j~PAWciicpG(Z`3+-K-H2A;}t>a9vCsEE3c28BrL;T;UjNm5^%D>gP`b@sw(L@ zLd&)zuV&;~vYSA|$1?!r@$)Xbfwbt82}X)fAV3`7PiTCdTSPj$OehDRU()eW^Hq}w zVlf+g(n#?bS{rx>;F%I$z}VXXdEy0n>hJvG2%+zDN~``pH;97*lsaIeF?jFOZZ)Gu z5@irKrk>hNvYgutH-1vWJVEi#!-(*k z;MjBo%ZI*yKixBarJIeoJ`i?F6n{ovrEL? zuRqyucj0{qyN#FAf(BN%3~pqZz{0EE`%j#Fk4qd7C1O09bV9blkFRD zihph(fxy{-*|z34^4I4S)d82rzM#t&j!W{^g{(K(la8_$HnFW>6&E~ARs=5um?xDJ`I?Sj zRWv+UmrDrC;kwDcZgK9(mTUnJp{{ajuJVcCsI@VQRE72P>(G=$Jt%$jUx^)TbVNk;r)${eRX65Dzu)kl%9XYBcsjfbSS zPikmhY2Y)UVIJ)|mKjR+#qK~_CallVYw0~A&G7LKC0+9q(m565vd1Nr#mS!R?8&#=>`-jDa8XX0p0{WmPUMb)UJ{GCYv`L2J^l&jF zI?Y7k7|M!iNQe`EO}DF*FHvC7`>LWeN`z4Ag{7-tFi&zcz%EPMDiU&nGi(Ps)XUu{ zq)*vn#>z|M+tC^)8Vo>lmoxA&J^D%5AEF8sgms}A7GkK9hA2jzt!g zgho~tj4s2Z>2^FRb7Z&am-;eztG=W*SiCia(h|h-$_5u3JlT`>LRVd-Q(a4PzY?21 zm?&n(cSEK4hc_Mtf(1VXyKy}a`5fbcOWmi~l->E1ea6VQ_;odT6Dkzx*7>PT($b zPhGHY`n+PIJ4|kO;5TMqA^s}~g^OR+8f)BHh+794WXkFrZ%rQ(mHYve3e*gp89#bm zMruXQS=8`K*f=zSH%00eKJ}j)V^8+@G41{K{v#%T^5FGaMq4bw?{hWiQlyLTGBN(g z6#ZCb=E?^AjaPbcg*6lyhh{0p&14m}9rAhKffJZSj}hAzu(P)a)vOnlt+e=g__wh5 zs~Pp3jQGdSSJ~PB$;6_nIae}!wTWWhL9Eey+9*+M2`$NG*rztF1;=F(#JC|Wx!0Q= z3ig1#Rf`;k=xi(iv9Ap{_foj}h#J#emrUOg&2>G&(I^!XTAZ;Cpw(|gxY(SQWr5 z3vh!Lc!4p_#=b`Uw=D|x;w!IM71W$mh@SM_<#F!2oq^=JcEX6>@emwzP`T_!PIv`L zMwD!;;}b)dFec!JdwjQ@S=Mjw!VWctyB?A0ZMH~wsV1IU8m9)p97_aU<}nn2-fk!i zWBR@y2N%uA@OieP-n2s7kdb4{;h?J_&u9&TD#W}DyyliDC|Uwt&{_W<8Mu%60O44J z#R`}eE9*Af{kD@JA=G)`SB~r6hvNo^_bWY^sT3UVaUS3%0H~O%zrFdBJ;`zMI*|H< z12oI!JKNJg2P~S1scRvFHX*LKPl!Dp&EEIO9@N^oSA;?y`rEmg=Oy8XTQCk=7A34d z;;6G6!~G;CXdDdyJYspO@A4Gsj|mCbz^yoeI*y5Gc_DfF%f}>fIetBk;=vQa-f`R1 zD8@w}7DnSlqm@X|ej!gGFA}stvwgJRGe=A}Z@#+a0=l@g3E^vs?w=E~dwV3pup_bL zL-d}rBsw{S-%;o;;LnE21V?q2FCh?@*cR)+gL%eox4=&=!T|=-w4bF?w-cg5x3h%p zG=2e6PcqC{tK{V>a6Qdpy7PK2zXPO=4WTwxN36Hd;!|vqZ;{A*+!r;+S}$N%V&ltD?HXx=ahlY6Qb z;mRv>%gBz>ia8pO8%{t-{=pfF0`{W+HwhbI&TZ68MxzJ(hj^cIn-+2*RB#zr#_Q*hg`8wNpf~gMT*eo+xPz!y zEWvoHv2>`;_A)YAcFfsF_o^CA0C4*nkG2>}0_DB4j^6t%ZQ9Ud@w(B7^UM@oNw&Y2 zgc){ND?jb5#(Iz#PBL~bdici>EbfFj`ok7?gPqhPsPMP1Ka zgF`O@djZ!Jrb`4`ImR~I7HKh=?u2VmzAc#6c<#rD(9f?ovB&j0st=B%7o9l{O(JCN zY53Efr7+M`q|k2p3OZGrbEOT?u7Mu5#|X<52zoJHXb0)+cV03&bl#K4UNxRq?Bml< zLej~h(Y_#OdL#(l(jH7w6v`r4a?df(=FAk5^KBsa?t!8tuSHSk0a78+s;68|E9QDI z*GFHxiw5jR-|)9oqN#)q;@s{47u4+jBfaF&%wX9j4#RYr+PjeeXGd{o587Ox$pb}; z#*4IqVfe(O<;i%7-?)P1)aD_A6MA2fUAvRPKYI(*j$$_&fH%=h1ohV;GPN?Fl!`yS zhHH{|=cEbPQer+zwA=*TvPCn)0D49&7g`U>3Cb^bt>FYzXZIYR;j8vv8&Tj^C`ta@ zO{M$~&}0m*faixc=}KT^P7qv^tKM;okVvzA?*bt?UD>B*%Ld@R0fSFB)T3sru5ir* z6@7v}1-;nr_pQ^iMBgpgTnVcC#U5KZSlEpg#5IbedFP0AVqQtuH0~p6&j%AyalTX2 za>O7^GCbUc899W>0ihSUGe1Ow+F)iGxX&S*%db$s#UGu0Gac*LsM0mJiT%lWc$6Lbz!&Sm_+AMf zE#N*6rDP~)j0~++IR&@4f5nppa#Z9b(VS!7*w^P8T419IoZc$>u!%uu-PlXgR@M6J zd_6P0D>!cfe9|a*vK2kP+Zt|x7*8f8)e*C5^}f%?`vCnj$89wc3d|!2B;fH(#+HG{ zc>AG}4Bp3c4?dnkF-6gDf^oZ?_kS{M+bH&(C<(!zI_gGL5xvQt^u4DDjD@(*Q(=g3R8RXQXBW#ltg8HqOU(x z8lbW5tT{HGJc{{`wp;)SujY~lF-jjnR2Eg^mj26C(YsuPc(qJ~nGYwibsPPN=d~P3 zMUE@ORJqUtGI0Km$ApaZh=7}}?Z%BY-5f(Np5a%8updUvLB2*Ua*86S2DLrWsZl5c zsgkx;!8O1$M|V<0=<^7{+{_I9I^}@L*!>&S=?EsQ#h^lY<&QWqREQeq!s*)6N=5{i z98h-P&RD`KXX>sKHG-Mnj*en$?bEeRG`@3?tT*FZXmxiKNH%|RtYzL=IRCG(J2BOd z@Vn`ynVmyA_UBG{KKBh>6l`dFc1K*Ozjy(dlRU^{3@qLmz&8Cwr}9t;9R?__)O%zx z&#IMBz`VO|<3@lDDrlxWFjG9V;F{jHJ%CDElmeCzMscYDsDO@F(6RapYkMD-9bbg+ z@H+6+{ef%}5wluD`-8l>pxM^O zBkK&?hm>6m+19j?@E$d6{vZzAT7Z7c$aDf7k5`?N=ih`|=wTw&$S*f|p^>ZFyZ*78 zNH!!r=6NwH675WbtWl>Nz-GJbDntuI->10cR5O9w0*#75Cw2bQ{k!otR>OdHj*S%4 znUQvb7k1JTnruuZJ}==-WML}EyDPN|(a)dq*v78I^uyZg)n{W_yuqj;kz+nZnGDfR z^t$)zdPOWC!ftQ&M6JnbAHD17|2p8v%9x~$@W-gvd&JG6$a-BZV~-h*(UBtyyiXL! zd&Gv7RY7&YGscD|u2eK4+oa`=saY2G(;(s#YdCS<(4M97*;vsXYDsl{7eE5(2^EmIY2Qi+B0-g%M_;& z{r>g-(GO0?twT-IIp)B9Z5xio^d?+zn48HcpD=#5b{_oYv=_0}g1m{yD+l+doXXbs>^Mg!iTx`ED$YRCDW+i3$%{sF?U1Hj zW#20ACvw0B!EOajF;z{V!(EX|++#*tA&h@;`GFVW8B@I-ow#EA{%Ax60vL6l=(FJ- z#8|g5XxAs@FB=8>eOo$zP9*P)c0ntwc5aEc(Pzo1u&UTSZXTp}lms^`6qrv}6PvA50vJ|K7HC&e60Z@u1iawtr#{%mjU zrz}Gws4zk8kpH;JHv%o^m3$ufa-R&k4@ce?u}?5PkWvDS%x^5$KH)y1jccxaIG?&k zHSNCpb3XgB`0<3|0=BjU(pzB6zvtTHhQK=Hef`a@9nptqxinQ-m#6= zpy=y1Oid=uB{9QURMQO9yHNgX$8TQp8Hu=kk#7m0`6kKI0+>v1({W|H7FmC zPYsFXs*=#~mb}fo3)5t^kZeC#;9|sLG=U>W_hbXHmvs``Wpx8iaUjL+Zov9(PWTN}CWYJy*E zhIPO{n`?$;i93{p6%J>|E(dniKYzWip7&R3G0RkRK&pr6Z9ZqqV7!jgx1nRQ`qDWA zYgOA<6KA@_{?m}tk^7%l5Z9OSJ-BoI+=%83)%06}=pJjX^A%Op z@ib2IXO>}ZnhB@y>?ZRotm$Q~+!YNSwV~})aSbH#V-M&Tb4pD6=IVP*-h6MC;CPk# zORaO;kczo^Z_4afV)1kXrC|#R{(X9w)OG`>FFkW~Lpov_zXvneKdTy!g%IYu4+N!l z3VCOc?+UnA@X_(UCn8WBhq>(JY9XU8f0(%g6@(H@)6mFk_@VGL7f(~JuKT4(xqP-tR5O%05Uz_`Usj2t~aV#$7{Oif=QW)ySA#%ztTozciWzdYGI`1G~d+ddGJsvf=fNfBXDcf%)hyh~APNrf18%PX6{x zbUfUb_G)kW@-TpJ?ejD}2r;{SBg9c~V6l*>FN$;sH3pP`lNvk3>Urk`yF*+QmkFqy zx*oUf>`5&(j>&|r6zj_@u@z^>7qgy?X<3A;C1$&yO#eFMIf~0|H8H5)Hx*GCD`7h> zO`CWia)dRdc6Q9KALkmaJ(Hlp&K(GLsWZar8^~Etj@o zH_0T7fbksOEq}uL%mH)y7qfydMFHBd(ZYJ94o~6ht&K0rq|GltQ#j%RE-cYYC5jme zW3VaYSJyZdJerhZ`>T7+jepi**A?Cw zDoVf{?K`OcM3piW3+G$!oR{yFdNxov|Ch0xWkXd%Xw zPEz78LSD zxk0Y;?yD(gAGPHh>}vL3QGi|t?rn+!574Gwcdew(LYIfyov+8`86Sn=T-MbWK$TY9 z#k)@Ho?mQv*ao!onVUc?cYiB*MG(S#%Y3&0od(!n`EWsHc6GtZ+vpIHdrJb^9CLd# zC0FGya%b6OB24v7S97MrzxuLS9NS-IVW#W3BN8Ik30ve{N){ub>T z6@_auA{U#g*RU3U!274~J?VESYgP;}==~I1Ars z;b+0E<_3X>57jW;++Zc3o!==j1ssj6mDTU_#J=Dwb78Xkjpjib9kjBq{z!!qt`$@9 zB=Z-R2%OKh6S}{K-n_<>K$pmKECsysOQ0)I_zpzg93XuWPY+`?c&ff{EWc2KUI$R1 zi(xUcGLqMXDmr2#w<1&OH~cqoyy@OOQDDAL<+5_F8$ zmp0{XLHt6wk0ok5Yz=*j?1TDk;T{2J$aA(1>|9*GdmKzFGI_}Tua3+aYSV{Ghbwb} z#z(kGblWuvDLNbt^Mu>|evcFi*n|2fEHuLea4iM#5pSLnF+kpHvQiD4SI1DVwt_>= z{$?EB@ppUqg?n-5eMERg9+Oy2h21~6e@Rm0v}V>Ga64jn7OwuYAj#5KkfK+)Zcnr6t6vaY6ezn(?|mFXhV>#TI-}WIy+mfF2v(%LFOu z-+-!`;-5g)4fA64`7yuOLvKItyu|ZO6+%66H@uVi_mt=WHj=0%zyI(dufYECJ^izy zd=KmQt?mjQdI$5%&NvP@#Q4opt75zDLvQJm=B1Y#*2V;X@oycXD{cn0&G6=669OkF zBchJGdTYXi7EcTg+Gv*RFtZ&@WNPbz29ye1j(3S+AxNtPKiZSV{e2bD@bS^kBGN^& z{9}NEg7x8#cp+79ouVR5v#`$EyBHF1>|3M8_$urpno&9z9uE(j#-;2ZCt-gT<+B&A z$A_JjvU6?6Nv#$hA9ReS8b5~lt(s}0;(RmgbC6gscNr$?8*hnnTl8ocuQ>fzdrlyrn=y}>$a)z-p9!Es^&(B2HjO;D!x zEVqTI!&m8dLG=QHo_az5$}k%{gCx%rvr6IKKzmHa z1G0Z{w8l-G^_-kF>ujK);#(fxc6b3)XH9#tLP1B@uh#P|vO?uO!Hn`r7AtXbz;gw0 ze*7Q`1z8bn`LX%CiX+s44neB{uIXJi_BhP*LR{tz%G&QE7X9)BgcmH%Y2E>cf{H^% zA1vygq2fI64K`Kpnfw*gHfn_Z&^>Z5!%Jkj=os_k5s#wKquEewc>nYVQREYVu`N!| zmoZ{Omu^G)4&+;N)04QbgSX$?3i6h60vCAE;WuVXq7Yzd1tRDZ%#QCw+$8KZ>Krfl zza2;+u>6qZN$2J-e=hLf-)biPv9++{{$pQm@w1*V3VyR+-@_(E)FxY^)fDtiR%|P1 z3=KQvkRGK*O2FWcp0nVJhIwOJNJO{sw?JRk2tQjom}LRhThgAlBzkT5voQLJ+;e2c zF3UA(^6oqxyQOa$hQNP-z5Kf!P0i5&PR3yE2;I(;Dvk3E}`t-^m2?S(Vn5;w!q**{%*l5{7^l%YZ;-D>mj@@ zTNJADL{With*kTvepuK9UA()uRCq12v~^h=#sl2x-iB7DZ9mV{Z#@8O(8P+kD#QX5;ZCH_}SnJ($<|k?9VlUYI7Ik+eg1 zu7c*Sg_&3Mmz~Qx5f;bJp>0hMzC45b46atBP%W-cpRTxewJ)cHtq%nB zlv~|q zayTrL2Ac}~4>}M<-1yC3Lq-DyyDGVx={q3s1C$`Z^*ah5J{eU(3i`JtY zVZ{H=K2IE4N9>Bz4R$pcc6B z-l)sA;*|*v^A1uxd_DStc!_Z)Z)UCDz}Q}`r%I6jC-UZ`wKal%OPzG|9=qtw7I>1K zJio9!HMwUH{^QuDzApQv4q?cR@BUEu6@+)3S|&eiLZWH3e*`lY6|!}yiz6$Ucbon4 zn$T^(=r`bfB;VBTUwClJZXY%IH(NfF@7*V-y?y9uWH$!vyMKW(d~GE94D0=A1+>87?$EBuu%^IIyS&e7Qndu91E?Kj4mEHT)9KPkVR)p%^fAH)C<4ys`I_6`dRigevu!z3xv_ZS`8qU{UCzvg>FB##AX5QMzbX^V?i!>RF`4si& zlI^r}L#MTH2cehdr}oJFt%L2i)egTz>Vr>+iahs-&*t7txgX$#M_}Q-FRxBQwcNIQ zq3o?S~wBpMRWi*@@_2iOq~C*4w?-= z)ucu4z|?h9f+5$~o$Cg-BKIYIxVH}1pi;l`=~8AP#-waRzNf}39|NMwCz32IrWnel zjfJf|4sVYW&Y9#95+{}KAa+=TbMsX{74%1U^B|NJ3dE`L<(g;dV3n#X$81Y)S|M~) zwkC2t$dFm1{DUCisg@M6+Rs-)jGfmi#4G)Ru*q;w{Be>FYu`@?kXg-xc!C#d z|F$ked}n>9xOcA|;Js%gUWn>0@{mpQNFSkBpZqjdF+o+5_P%=>7``8CyqPn)f3#$2 zCW)E>*YEb^*&g>M`8{#|utNtfKl_6Ss>ryH4%(G_F#_n(w_A}=qFgTns`fh?eY556 z&B?7Wc^V+goc_(&i=3lV7#`P*lXQp|D%dZeV|wWYq`jWF{1>DA3g^2(^V1diAt(^` z9jL1d1enh~==$>Q^ldu+k>pA8A#dI4fIGx&w@u{l=D^WY+{|;w6U=KI{`%{Kjw$Bo zI=%M*du(gD)K7>NL+p9zmfhPTTmF-xup-aVRf#EidNioS5zvn8RwX!I4PG^4_>Zxk zFC8@@Ud>PU)>+aMDUlL7$k}nzsl)c*D@6s3Z=`y#w zrGFZA3dL}*fmpQhE4q+VjgT6e9LM)(uR4nD64WQ1Tj7?|2j_o zd^jFZy}benHxGMn0S=k%8UsoYX4=z2-%9xy0n+~KCn#D0N>0gWs;Iq+f5)^o+PWnC z4BN$qf8@g~_e3%t-)FuhnYiMt!nCx}#jPLEg%!Gc@sACG5803{Xe(=69(ChYgg$S+ zHuLyOU~Mm5xoxXzIoGmi>oFD%>C+;|-P_hW!qel+-Qt@Q40aHE=SGz8(wkl!@MJQ( zDaut;|3Tc2-5g<4|JH|4MGFTQ+7gZ6Z=!I1*Hd zd9usD)FV)v5hoB*4jK?d4mf7-#dE&l!{RLB)i=fQ#1C_v(nCHnj*TyS;-xUSk5!nY zH#ioBspY`K+;V+>NfTJox`AZ>iB)HsdtK_?aNpP(EshxOGC5fd;ZP505I^lDM!^&) zifG<{Y>THaJ37pTmEEH(7Fk5v__K|)pWC;dVF!IWNNvysd82KLb+#5^c)CY+l~P5< zg@d)#z2rUlg(==DddUz*{$H@=uIJi#z{hlx4n26Z5ch&;x1%Ky3(49gnx1kdr7LvH zT)T4Nf@n0Kfh@ItC1G&Bgiod-ByI#@#-ZenI@$}zY*(yyJPz%rgbquA{>9LV6q6q) ze0ByH|9gsTIjvx}=$?$y@#4(cOB#pYy}mbIq@S{;cirmX4bSU6=zf|K$6}?yd_u64 z-t*y_!35<_=ZA|<59Vv+VbGv_x2+nO5vzZp*N=m&GgR^ayL^FT=x9dNdeV%}3AbEWei%Skw|5R@s;3av5v&2<4cz?@?f~tj z1@;Ty?R|A3_f;ue9WfK!RH5L-v^Xr|#8l%9TXi&MC2@3wDuNsOdhEnu?ccda3**nN z-8-zi2srZ81}A?0!u+1f-TJ5vQQ(c2{qXCb(m$;cjUcDRv2egCF09v;6$CiTQ zygwYF-*n2@-W3R0G0{W;%AsQC`-CIbI70T$QtT7VM-t8w6rsKt{Xv8Q=L+D))!T1G z8zh;ZI)yB9Kax2S0HG=cGcVEG7|e6l$u7u0bWFVROy`>pQ}jiZ-{;f3jAz+W-Uihh zdKa+3{fZm=Hl^5kwZ7Yo>y)oaRzT{;4%~bcyd~&O`~@`1&>=V<+R~YqeZabKWLInh zlu*K!DPeEVSgmsI?Ue@0Q&-RYtiP(zzlAv(5fv7}YarU#lAWC?aPAGW$GXe&V>JD@ zZKEZgjYwpL;Pr&=#4juv6S!v=b$6tX{v%9#-K9C20#}8QPk08Nt`Ri8>hDeN1?l{! z+pxtTUCx07CGrq>8!GHkfLHfUFT z$_K89fZU;prnx)FoDdv9&vIVqew?y#hIP#Zi%fSU%D0e(I*X+17o%K(=Vy7+w9*9z zrTG_H}`XUDSv*>=q&G@SA+M>h7!AoacnGm!bjN70sP`H{do_B$VYij8qe4H&UD*^ zr?G-FmPIz##cUlWQbIEHrN zMzq5EC?~XGM8tm4j#~+Pdg^{T=0#BWbpYF)h!hKo*^g_QQ7rj3Bi%kYfHYj6DNF+8 zaNZYD5*M6!MpVBGeqoS;FZXb)M9$Nfl%-5eg~Px#;yzJ)F;SbT>g?o()zGZ%hqoE{ za?75$cf=FS+~XCTQhq`L2#=Vop|0RUc zbfg^}3uxSs2g|EpjDjHn>>*7nBps8vo%}Z9O?`y@Bd3wd!N{G&$p|tfmHMq~Q~x9e z-aoh(rqPZp7~RVWZs}3hMYs;BtJXD1E8PyBQrn)R$YHq#VXwg)1{0Q5U)pqwfOO+3 zeajEz@&IX1Lu+{7*`PS8j`6xYF8w=+wJc}p6jvDMy$3Z`qa-?`t09jPVHu74!ml(F zW2z&W0~i?5cywsX-a?zL+O(Ql3zc5LTnXZ+=br8vJqCSk4v(P~cI0FzvzV$chzOeK zF61aWiz(&E28#I7fD6kKn|f*F<7B|#5mAHZH-9lsxpQB5|D4nc3@nI62YYa0XW^3& z^c61rM^138A4~Vh5EFSn<7p*s{u&e2ItddBv8iDJ$aFC;Bhm#x!WH~&?oYlAX<%0A zH>b1SDBJH-(V9H#)7y`KAU_kiK+f5hu{a~dzgJ*1ntln2^t=wd?W{Xk)^0MpimlK! z=iL-nLv)LI45UN2VZV`+D^fe-<=B(+?t8xOHkPp4$7gm1(9Lu|+W}bLfuGhd!1V); z0m%7QcbL-ebXm(GTKqST`Js0aU>>WQ(vQ;QkE1yA&d>^jpc6na2Il&wW3Ah~m~yZ6 zK)EBNeRIZWd-d_cew8Ym;JRO!XOrR8Rts}Md>W0)c^K;9IAGa?%qz?zq(|c4v^R4-yy5rYKR)c5*f*U>JU zJbd^TWm~Q<;H;eUMU?UK7nNdeeNJk8Ot6wV&%qa2P;vVx+zrRDJKSzhpIUxZl;FR3?Tdo0)aziXzh zGGw+78~Xs|BtZ2q>!W?N0e#wZ_6T42BluUHPix{-RI1v>hd zr?-6|mr;9@S_Q0gU4p$K57gr=eb_ydFlCeq7MjWS5z> zLQ8nVHYtR^dZW|!C&zwI&bbNgyIy5plgTK2h|OXewVPCgO@%xb**+=6JFRqDca=d5 z{DZhP9{oGpfnaley*$%mb?M{v#_Pbd7c-c>G>4kI@ayZ(x^cWvWZrDXA?S1<%$gp5 zh%EVyxZA45N4c*`x)6_c2z{Z=zltk3$1UN#$BzAj=fmeLXyNmy>V}&g6`*7C;3Cb{ zX!yXQi4UjlY=vdd1&*3CHUa^AWDqgZsxAvq9`MwFu%;H~>NXQNRp;fLL&LwET?S#1 z5xa!HtUm@=i(O9y-KF?^G_~az`YLcHvZg2EW~2Pjx2dInn$Qql)do?RabW1>`!xrO ztzZmMUY$6c_{8ZR`*gp1HgU)VDq1g#Cj>VA4LN#~`!UzrY{0UmHMw?R@B#m}w*H8UvmPo$Z4f(&BFifJZl`*&)sX}?=e;LaZR=>7Q`lVjI>N>h z9VAs^xh99arH4QI+5_4kK`p*zt4JB6Acod+M{cFL_mXNl&d2+JPMQ#^|LLu! zSN&J7R03uB@^E!^#R5-PM=Nm59H?wUhVqoV0JNB?E3u>Xk{)*$TCt#Bhd2z-E#oIi z8IkYZGOKi9-;CWwDo>l4K}lra)6RBiH=Rv*PU`DUxG} zeD|H5a=ZN|bRa@o7HDN_&iDX)Py;PEX@8L={%+_JlrtuOBZo_4yg(C5u_rfhY=_mX z(lzwyF~0ECLSY-urLN$xr)MI)xi0ex6dd)N=2bDjlH{j+za{M-`y7=1TEIRu9{kct zQ(4naDXhy{MJN7Sd^6(cQ-NZ^IY9=e{-^}(1Rt(p=3#A82}-orHj+D#xNMT6H=fO! z+#Xn!@+O5aDBiy&Li*$h@d$`ag9}%!2KSrcnCDMJL&`zn3J;^ ziSEthxUT5zNF~_Ws%)|T(P_fnxEnOI*(Y|{&riYp2k>Dnu;+KW!P0}j5~pN1_khLS zE4DW4@vrI|z1D{0!qC-Ig@2)+C^ggEpcw91n?|F-J%zg3eZCZZR;hTbr{PsCqj70l z+Vt%F@{2izh0d+B(@K4E%dy}fuGC|=e9Yc5F9E6WPulr(JAWkH)9=iGnkFWy%*V7p zx_oMMg;clBt_un(O50z4$0i?|Wy*ciJ$;V*cG^CTng5koQTE*6>>_X}ZUt%@dZt}h za-i;g3hk7ji+awtw^9ME!4>l{qpiEysUoY;C>PKlqOM3eJcUd7Mb06oOFW3ZY8d=t z@LM`ult`4{)yH(eTX7fP1Xm0G#ngQbKk5K}My}bioo*bTlJiDou~NI4*~+(Df)3gr z!=wQh_z&~H!a@&S<7(8i9Ph2o=P>Kb%8o05)wZ+!Iyvec?dak4B4|WtW`W>6&Vv?F zlF82K!!9mxe+eNH-K@d}&|IqQ>lexNAcglC!cSKE{>3*cnMGV}yq@ag&nH(C4*`dY|U z>AA;JTL$gQ2h<9x(>IpOW>_K{8mG943&=pjon;RKrPgYu?;Can^>W=g4lKX3q$S=Z z_$>c$3Dy9Rmk&WFA|^21^JkbqlFCr8FopA6z& zZ%;<%r8nf7gy$0C zyQMe}at-M5TKJ0Z{67D1h}?pn#%axNx~&y=qNwr|EOek;60JHL9r#4SS!h3a`3Bej zrt>HfwI4>5`UY8@IcPY5yg-%<Xly|*;ow(1li zq$lfD33O>&=xa6HwQX2uZ5gk3=vw*vsLkZ66AMB^Yv}cF28_$Y-Nt7k)(Y}Nc*HtP z^x!(L2i>o6#0w5mKQcDp2?-%>SMkv$+=T9YsS$RGT=Y&wJ z_iGBT2mMcSb|k7-HCKkTLL_d@`hxjt7T-xKNN+4(ZX5JZM1A2i!WK^3YSr%qWV|57 zFcyvtW=sLMh{s~V3~zB6=G$B7jeS4MvmnFGD(O_55NGf8GwjP|+rxMCQeN-GxpVKR z&;wMX!QT@B9-;=@It{nOwP>b(BaP;CMIVKj3b}kJM!5=peSh$0`8TI(PDMf0(l6ri zURty$?)7Hu=|(cYgMB#R$EN++$@ue9CE6mWfba!bJ4MvX?{WxsrCDu~0-CoLP*W~z zgYs>bqt_CQpi+E5LKrEhmI)E zFMqm>)sBL112bkC`uTvzZf-r_@inaTtHOoRKQs~fS}`tREA ztq6X0nEYb8UwAae-~u{p)84TfeOZ|a($GFX3`^TINgYLPuyiXnF!wQNy?0T1`2f=+ zzx2~H4z!*!)z1joKdrA=-9E2(5E{{zG13SY3!rH2H{x1cWSFng5ZZsUaGii_$KMS4 z*M-?^gv*JtHwfp@o1p*Ebnfv?{_h{Z=UfgWawr+8bkY<;*hHm+QmJ&nltNJxIc~NI z(MP31RBVc36JD*Lj$v3;pt~qs%oL}{> zG>NsD@A`gX9kOnT*t8FEg>dg4@-(Xa<6CI4r0Gt}rQg)(iyO>NDR=E+`~T3GUd+s& zJO@@yuMjUZO(`4bhRgqC&F9MQU8RJJhFgG!%<87Wq7AQHHvOrosabD}@2`KxjgO0( z`O$Z%L7aD2BCrS|n58c7SVjIIcKoF5=0-in+75XI=jOX%e-fUv{#=OvvIp9v#VmztnuO0>ZU(ChzS{8d-&s({%s zh)=-W%|Zdlh}^Pk6D_tmBhz;F><48vsS#FYk=^%i$swP-b(r&KKbiC1nQW@ecZxx& ztTFX;QJ?$Mw(1dL-q{tj_W@D%Y+-Xk(#q^=TfE*J7(MX1x0iB<3DJg<{@ggSxUC8LnC=grY#}Y`s!)1pzy>)n_sXhtOs)-Pu~Dl85X@iJ(QJHR>dlf;tl6`|J z#vW;3%AtBDSrdwHtU5M5Jbjj%owB|W#)nU-ICvHFQp&w%Jm1>F^?uF!T=5_DZ zK?h^$?ga}6O!YRt^DRl*ccZ~1joEFvu50zDWrlb>xRdwv0`{az_HuH;2F(pRhyTX{ zY(tx8$EGzUoW29W|XrT`T*!%Jer;1zbK_w7B#qfaJ22rPV8?oC7(weH#oV*Y%FW>VRX9izk0 z9iX;Ti^t9g>n^US25yewU+OK?r+DAA>;AIgD7tM_9? z&-Sg_+cj*{0N23%jURv%dQA4w4Js+t&#|QGfoIwN>kr(b31=oFYTIfci?XeE@cq8c zw&7xncfMxmAeY1}am_m#b(i4xPSxNoyj!*bQjnT9uuW+Tqv1x5{J$57G`DN}NKc`O zYe(^h8ky=t;v2?N_kLxPEcBjwo@}Z7S9EMLP-_;N8N2TyIydIlbzetlaRAHgn|TEI zFb|eZUSr_4p9Ime6aUzA^7+!*J5)5!iby{{yOxhszYMhZ%TDBr+tbVGj@-amP~6rs zN{}n=*SKkU z`{s}n|FTh|VnZHOqdU_a5DJOp{+SBA(6^^q6RaAa{m>`oKPMetjB-x3y`!8| zy5+pELkC_X3#}jaZ2eB0XS^xu=&%r$Y#Rz#TC`NA$DZ%^T&H0!9x`fzW+#d_g7iU` z)24lu?QtbDZHoJr6C3Nw-Fy+WPd1bH3i%*}8MGO*nHs_=b%@~2KP@oZ!0EPJjkDS) z9+-~3L9SSJ!F?wAO{e^@pP4mL!D@fvS}Ic`BZTL6VhXc}J^^LB*2#L;KTJ3ice?(B z!=;Uqs$`JeS?s*ZrnQ>`jlOu-zdKBIJu_;)aAckPx6V{sLb*$jA1_ZGKLw=y8Szb_;6TaM$uW}oX`24KeUJWXQc3WMHn0yW`%dtdtkyFaW9LVd;_hNN9M{H(sor znQ9G0pKYe4q45BV4B71yiFc}AMu{gA=q8V(2h^&68I1%zzMGZW3hm+#9U%)&*4}HQ z2Z~M`Do>+jNh6qv9L(+o`0oa=n$5hd+&aI;QH+}zsUM7jCIZ!E+inxPdVVb?v_$!e zpBvWF=XNZ*Mw=&EONW?a9^o>kFH(8g%rt_9cz{cG?HL~K4B;20n~G^;!GbNsJ>wlQkkZHKQLA3u!DkSB(t9-g+{UlEBX*sb$mpSAvt9y=9Db?`dSdZb$A7`Jus@EeOCNXU6Fw^0NF> z$E{2i+38oX?AOaAB(<A z>VfC@sHr5+SALjK7J?*8zb`+#)RVT|=@W6?U+gPcj=8IY`>6j3AiU2|N0@R#KBEP0o@Pep4#A(rQg>V0SVxW#0dolMWHf?03YXfEB zM<(1(7_`Lm1 z+Ewm)S8PTZ-S@h>--WlX@A7Nh$7f15LAEYMySp3$(vop?75Biv1@`GCtBOrY(JzT<4Zs?@g4dqZR@BLc(X=ME3-|ni0 zY2REQ>b)%Z+67OK?T{}D{@IKuD+eP;kK-eGk`;EIZAa|b5sBixaHWB!^Vd1PZ5#WGqH6JDq8hcZnC3qVuh zn1og}oZ;PnDLdBz+n25%h($+7mkR_n`Oeae8<6i0jIPwzxQQ-|AgV9^E*UdZ>F}Iu zTzK=BtPTp;C1L(54M<4edOmU1twEG=gfcoCbnHao+LidiO!!VgHebsq2W*u!J%6n=TK+SBD*dhcK6!^mqLmg-k-a3s#HISnMTN{w zasJ{@?@O^^r(;daL$(X~$X9dM?5D)*1-JeveeBox>3bZHe(6NEJ&{oK`-~jGJ&+F_ zWY%PFL%fOP?B8o1f$lN-d+D6;J?kIzl0#KJ>*R7SeXC(N1`2^oV0{!&k%P zKpWAHmgBzPIL97w@4S_beW2CxJ-%V}YlqyQ0b6 zj<|lDP*bsVd;Gl&^bYxRw30Wnw1WXUARS;9w?TtmJ@SM%>Gc&VA_rAd3 zPo*upBUw_}LP`fMdhT}97F@7K6n`-YrnJRrjCNYI`L$$cVrGvJxp_p=G`V?qVFna? zU2?kZ)CO?F{||oa1FCywUWUW}IwvijRBwiU1|K0!o$Xr>zBnq@-VEzV>HD|*gX>-6 zFRYpDaZq#qPts8K#UW;;p9qm0oQ7J6VH*>{bBLJ)r|6DcW0lhB`pt&sFC-g{ZK7OK zY&E_RVm~R@y;P+NgSM+$ecGE6#ya$YzLCrf(+r0eF+Fe3B3$$2lNI1lm2ub11In+T z5(#c;^FD@3_3wH{s+6f;<}y3h%3B8u#6k#MnjT3Y$!4k{9>)gHzH&Q|#!Q;4D@AC( z;V|;-srl&b`s{zVaGvkwd8VrepYLRy0AG+=z4f(iXgH&v*Z*!Bdvm!`pl=_zk@&<< zwlY_fgNv(bo>srsj1BmbSazrie1kLY@I0}Kb*=jd;`S8j96WTcBYBchU5)4U_&B2t z%ROg%V+tnj8I44=8_mOPmai{L3(kv2IYt%UiOszt8ft`RZHISCZ+iqW{T@skiEAG0 z@N!)_s#Q2C;~#cstE53&@==pQ-x!&eB3kION>5YRjiq@3bjK@JVG3ee`jSOj*EjsO zd6wcgn*<@-<;@=o7nK$voE1vRsCPc0^t3qjC++&IkIgChR-knyt$R4yK;@7NdthAo zmc+uF_MB5U?PjC2U6j}^@YqaO?r_yWV{;bXFalmJ))J%}X!&#PPZ;F%$(H-`Xz!56 zNjD`y_JM0YjAW1Ng}iz_4)qP#(X#&WdG$3c`0ELjJK{JSPvU_lM+$l4U11A*v#|R| za>(do%9BSFvg76@MC(?Z>+7LzwT@YQ3}-%9?_@N0^c@tW{Mg<+m|G$!ZRH=IyG30P z2HYNROij}f%*T7R)&~_r4ug#AB$L(McEA^FjSQTvqM7L{8^aUpP<_g5vRH{3g-_VP zhhn5JvEoxU63dkxpF}@{MvhHZeT~3yqu?<~6W6?7`iZyO;m^Hae>$PTL*XTiUE@xV z-71cmS?XGViAF?0LADj-p)0H6P{*_hmbuLQ1V%Q(PRpa;BGl!(R2XV7P0^K)9EOFB z`plx=EJ;NrOQc~+>U_wwv#HXkq)X}6>%HdPGf%o;o&B*> z#yD=4aQ@5+L=7FKmBf3#WdgRvbD|X67LcH^4-udEWlIQ@D)He%`mSTb+;N{zO5P|^ zN}`h}C5!Nh$x9Csw%bO`_BiBEKH(y!i<{zYa(=5n!>x~zH|EG2rlUI4{za27b*+T9 zq*0TQiSOha=C=>~e{?kvnJr}ef`G9D0`#VGxI*`SJd*cxX%`FjsA{=wK4mxC`?%xP zB8nEevfIhd+(0EH^8#?l7#Aru{AA{*{R`W;f+R28*nE`q{@yF^r{Hxj6^uoGRh%JFnT<)wz-ZgSik zdcDnEry{lkVQ?KA^A7c1AwvNj_rWuRTn2BeTH}qX)AuLoRFuuca3v_PfF_eH)vVpl z+Be>2I0wHwKgj8-&qvYneDSf{|3Lw_W3s`2)2k+5<*|gpTgk5;(X{0^(*6)Un8%i+ z!_nmA+mjUKSV?2Jy5)RGn6u-H2TsEHb*C_D>u;Qr9$D~Nuhc8k<`Oe;QO@YwK)dYL zx!e37?Y^qQ_|3-h`*Vm5GPL+qKsf0|DGG8yzPFa+RcUex(_GID_Ss4AQR=9NL=x-IG@r2@pva~fbUrsNj zxtg*z-_^4xmKzJ%>eBH6xbODO*3$nH7~d7~H5VUyt19f8RFa#_Zr|O0@DD3x zHS!k1zEOKvvRXIYazEL(b-hBT@uAB{Cbc8(QEl}>ta|V1N4C7gc1h5~!H>_1>cL3V z1)Z1lTFIeL?0fpI583k79IN8AAyK)tpYK67_nQ%BY4m$6X@OW7fGaB^56ExbVoQmY zuvz4%LCZaa(J}1kO5Jk6+5wvQn_JuhE*>v-GQVSfifNe-t6Uc`>jD+(=p2Hk8OXBP zFJ==RXe~6DK68Ti?zN-MQ#bdBQi$mnn&R#3zav?|i8IZxonm0PmE7#-2S84Qws}Iclg3iw4D{}twvU? zYX92cTDq9bL7eWv&UC4~xS90pX5&KAk@%l$%pz`|>%`Pi6Q3s9>glBPS;uZO z-_K!9qM)781XV%!z}YVBIUaNlKBO`*gr^nr+E#J>9bIoH!_#q5=Vb$Kj{I>W6^7}? z!Z38AJY$Z2_D$lOhrU6YkB{nrO4e0Vs%E3J9cCkW8?(X765=**hPmj?2;X-Ep*Es< z^iEd*>3L}Go}SUgqOcsINbswMqF^G9*;AD-lJ3vaw$K+8eoF}@Db$U(G8(Uv_#R}! z+zO9UWFg%00xPRMdrIQZdRVnAvAd4KZ4JJzKG}=q3MKOrG-el&mxzgS;xFGkTVQt3 z51R3p@(gqK-7Z7ypE30$j?;#Ky^?-n*nSxcis8sbm3)TS8_WJ7SI=T~`r@9<5R70O z6lCWS_>RdC=cE|>LVL`&g_jg`k>U5-;73&}lUgyz$0_BDNnVtwL4f{d30$GRLJ(5d zMO=G+iAJ6J4IQoJ2rm{UzJErUtQFnbDLGi@dy!9mg`$_-2`KEZ+#e{-kk8OY>RB1C zhZ66Lh-RTmf0NF@jl(8G7F-?ATK_!b7jT#TvA7UFy@Z4*+EJ8|s=pXS2nh*c#%@zu z>Ti4Rhx_iO?y-n?laIv|-?8E<;PyH25$yGQeV)b67o=kZQYjr${9`#+`j&lbC{gV% zvMGMRp0rael7xl94FbN6*IYOtR;6M4dC4yVc^zKM&Tx4Bv2Fi06mkdKa%_~DBLV0B z+oo}Qa`>mrQjr_h^G0yBdk$>B8Dx)Q-IiS29ns%=Tmf>)rfDNw7T84<>m5(#D6*Z18#Q%xVa84ZkUX$y zulZkYx+cqPT$H>a;47%G2#;rfbLf_>;U7Fe)k?1n72H^WmnR-AKsxPeSie&6@hIsp<%`N#E%+UGo}BD_FQpIzXfj|e^M)Py~FF?2)q{DW8;GdGoQ1~ zu8u&KET*)$&uM`jdl&^Y<`#_(J=~bY@3j0o2l;$Gcvm~MS7XH_4ceic-aK(c>u#FX;R_pKy!cT?zzEoJIG$6mw=Sf4H3}>Q z<)B8Tpfg?7s9RUEKZG=UiR=cj4|Xd@jjQUK5h}h}7LTZFsTe7pQp;JuhA1x2Vi9tc z?lUBKaX1u(@DUFmoWF+MHTCTA?DJB+-dDy_#=gOt8&&IG5Ij@UZoC)YoQR>E2fqFx zm_y0a9qpX{QQ5m6;L4ViI^sJ%G^g{!?j|CB-46J_?>P$kp zp1zw#xq9ky8(kfsJ1Nn31Iap@@+gkHnK)CC>;x5cR)cat&1M31^^A9>RL$4{Ss8Q? z2V48Ke(&OMb6|-J?p}E@6!rq)qjXVaBXBCtL-XWOPBJd(DmO%9-^^wnO+Y0 zKYy&oRGT&+_==Km&=c5dCB<*c`^0MbBE><*PaUQ-HCAfgJ;WED?7?=%<&A^WaV-MwlENTC7&OgNhO#7V4hI`=6fWxRmSO#a&&!R_G=JvUbKD2 z{{$J{JC+seO%f!90Qi31w+35}@B0V{d;uZ=@1boxC>t9doPEF1>_E1|>mm4`q#het zZ{)2^rODgYXkr56oX=CjaV&=+!gdI$3? zc5SchoY4)U{kkVoVm5vg4`M6(@r{cH$QUUfte<3x`zGnmJoSjTshRS`fDSM%hh=6* zMcnpFVEkjzV*@j0mwMD1**J$5fOydvLUl-kbGdCh*8~Lk`Ta4z7Yhlq5E4zZu{nO6 z6WiZh7aV%@;7Vofuj1hAq{~@n+}fvo{H1LlTO{S^rGsDCzNircI@g0 zX=Gw;H{v@UIf14eBjYD_$Mu~eYT%-dVfXeD9%4dbmY(L|E=cO_*!5opHixKgiKiVY zIeiUt*HXh2%J2i|js&*pDZ&TwTum+S#WUGA;O#N0J3yA{jL@}}=*L&X9?xa!1yQE8 zD|$zay;J7?j$ZbPO^!jPS)`wd$4YR zfba|O3&8wK*Z+|t-z4_dJ2~E-eAIp?C@j8(xe_RwUxd!#qqpa@T>7kfz2-S@zX6U& zk@5ed5>9Dof#P%{S;NZ*ouO}6cUGG<34@MiQ9O2ib@rI;ePV~z|K)3qT>xp&NF|as z5hD5UtZTa#dr7i!4#zZ6A;KO+DUw`1Y#+D0jS650^(-08{D2#a5FdG2iyBsM#$GqT za`d4FfWS%}=)GcHQYL!BLn1xKg|U;s6%Z%Ze%_)F%V<=Z>BMSu0nFwVmH{u`4bv*v z(;7%uZ1mA4-|lZ7`!TQ=?^ZE>-Or{^TDt8Z?S^arDrLr4pl|8r?FR?rE{Jc(=NzPF zw7?`${CMD_(`@gJ0RE*{Gl;s#g27{JWM$3&6hOh?FXpL573hFMv#y)QFOh6jFzn>M{fy)#C$_W;Dt)>?koOJuNG^y^ zxD9ONBH>%_mBp=8Z~J^-y~E18oG z>n%G0cCv$Z5?m7y^|p{7B#v@~#;M+KW(9UGuFMvQBkoz3dP|Z(&4#Fv9OZz8Mb~&n z4Po6DV$~qrO5yVvS1rjN$+ZiDZxBO3>lU=_lddrm7tOt--;sMdHh;qV4eQw&GvD0Y z-+43JePmex+8@LY>Wg#u!HDjP&;c?&vz34~lIHzO+IM0}(-V1jtgOWs;=yLy7Tb0P zqf;alliCvmoAGidExb3=PuAKByqI&~E(m-}Kplm#NgUQ}Q%obDs4>~ynutCH zj|Eue^o{4xM&@RGP_Y|jHC3DY=4RGuXe7foQ_cl5712qbWW`&~(Gk@!b>`q?_?9h@Ca^nL1# zIZcpYu)p3!ZB@F3il&XAjl=hjq+bEP>Q0}4`>i;bg)P``Nwg_w{pR410LvcrHp6^B zXU_d6ebQb3dKKe&KkmFrFg-U|Dd;FQGEGCxBA}g&9W}~$ z@i^?L{M|gt_#Y+p2Z4gsUk<4f=j~WX7D{eKh=bVkM@ ziE*)qA9_3t`CUWMTd4Hm#|)IrE#FPA5pA4(_Zm@^%3fzHvj!MQBT5TIo{h>xsHbj$ z&~=k_?wI17wn|#$-B3eMx6%4_b>suvB7c%CXW=?RNqmCcioqF$LBx5gFW2g;+|~67 zH`gf~enNF_o7PQR5LtP`s z38x9+8cKzZr0}XM6U^#Z1Y;4RxCe2|iL;f2E*2-Or77-EfT^Zs#DvC9CB{F3*(mMy z0r54LDNw`>KC=7UJGRVqpFuU#RwHqvSxk7cE3 z3$zw@RcdJH-T@{`G@mM2uhPi5%dL4m%HL%7PZF7#%lEaJKNuBy8`l=m5qgo9q8!xYlId>f4=t{8qWB~)23R* zP+DH`NRMHvN)HrTnCSCBSd7G>#x_*33=szeDk!S-W!J9iOF2rT!*4lWIx1nR10KKA zMYoQL%&MOA>+EFKDvZ**6@10&o>EF-zky0E$k4U*+=)3WggW`^U7m0=D7=cw*nr%&F) z0Q>34Svw`QE_J(S+2k95fFIwLTFdv0~g!hLZ9^Th3)MrDq*6*=tfgw@TX-> zeG1X@f%@=b(Xa5#fvaTmcJ-U9Z$TA5NPndOH9J#EI3ys&iQf>h(m5z;c`O5HgaS$z zG9@hJIz?u}#+Ug!K>|fX>x`#7ygoj4fEXy+W7bmay;hxohAZB`Tt&aGOzQu%8dvHC zM407J?rMcEBRaP7o)e7rsv`PVF?!d&L2zm3RoeLhZzqlu##_Vw{Pdjhb(X8OP_&W` zkVA%){iszbTql)AB|z<;rQkyCuuSCePjP?+`Y5l}j}BfRRlGpL>5D-*0r^3e<(+eHbR=jeHjJY zr=~`}C>|>{r5<=dOJ&oaJ10ajA@_hp%#&1VnP#5brL6*G7@UwGJ2Z?~aevm+*~M=eyZF^!98-u;=N-=}iWZ&m+vEB4|cp1o}j- zXJI1tgl_)eVCDyv2B4yUiT1%QR4-Q=NjpdlT`sF_jB=`xmhW5xyS5wx!`|xY7nS$l zSwMP(!nrGHc-NYol~XVP+hR_GCA%t9OUmHnIlIiA5O=7Kg zw<+DS(|vR!@F?;bq*i)ziqiegjBG4~e{_l8`HSx-3cOcM>Eb0jo9&+AL^+aNY$eJ& zD9_%|D>XIuhdO;U7me;(9Qi@op-Nq{&!8OLyq$EetT}cfqy~0@!28s z<3ItESTWM7&ImD|!#KBE>*W}?Q=P@5P*=`#?@55oX+b(}yAw4RmYqsTC@?UMg{@O%LSz6p zy&d~z_JtcEdpJTRPk%-TYGy{gN{mqZjEz|xG?~^>IWj)<1U$d^4SmTj_!CszMlx5` zXf=ga`O=noC8^O~TFNT*Qr zSn6=9dFT~}5k5}IIghYbCqDV9^KL%_P*F2wD+b!*ojd~xFx&9C+Y*}irX$l>&PXvK zcC0L$yu(KQq{NOcEl9emDZJ&bLzH6~?k^v({QXASsIfV!ZYqJ#_flW2T)XyXvd*!- z-9dJ?wfjIztEpbL^wSH$ z))EYzE<7dZ=b3ReJ>WLnkReR%YIbWoLQABJ10Tw(iT0;|^&uiex6&n*fuiEWg0gJQPT%{F5jRvvy4`sP(^-2hyGrx#5)F|L zk{F|&Bi&BNf40DQf2{Du^Wq*`S{@K5-n%I1nMOQ##kw)DMXAm%!L;OMA zGf&v}j$K`SkAf*!7m;7&8b4jkDm{%leuGY{<+C36(NCO_T^nvOWt1A3hZrWElNlr+ zxJEA{p&bjN@h)q4pzKO#tm^Tft~%7mqDbwT?jhatRtw##V(=-@*Iy7TN*s^7PaY#p zTa&BR|(ci`Qa#8h)w=BFBKhsp_@l~ zVC5C(>nA_K$#8)D72TXtUKg};f!TqLnCc&orKZc zN1MK~{pX)#_*6jlf18;+jK`W@G*DxDrYUl8L*cYXZ|2*=n^`02(vT|!UX+kH?46iL zL*2q3rjJ9qprH^yKfisvw#_Nzd2v@0%X&SCPN_DmrdWszkB%VMj($DbS$1f(+XhLt z*wbell068%i2ibwzrz?e2T(e`KEly+0JP|N2tJW#!d1NVGYRrNXK`4r16;!KwtQxz zt3;0*uTsQ#c4a_=o$`Vm4b##OXZ;XwOp1jwYyJh7C9Z2$pslsaw z1-mAK>7g7W?uMRrCPVbuu?sD83$ zgRiVIcGg?3L<#X=%m3Cy?q?-zGx97}UYrLKbPUG~4$NV`YdA>Qjv(CP*N5@4^I^9 zy@H9k4&|hhAVh`;p$^-NxjYJ0zH$by4N6}js4{XFbkzVsmLp)HehC;MOVem@`IiEE ztz&v4`-q_y9Q#mbavbt?@q4op``m36mEn+^^2`QMnF}}$4=Z}oj4-D@JXIMQwV|6 z<{{3i6J7NQ(%Z2g=iq(lA=fBw$Vo)KOHBqiD}uPoMQGx?k-sZcw)E^F4oMPTR;3<& zW4e|MzRC*gef_QNMJV=yMtEx*{ru|Suj3e{^oNRZ>}f6BoYOXA-B3%0K23(^VKdB~fYuymjDzK^$~8-RKjZB)K#rF?%KRh&f3Y?a?uMTatliLn!CzZO z!}e>42NGSKz33blsL z1JF85M-!dndoWw9j9-A?>%qN)!uYVrxlwhq+Ld1t+4pY|y8+L}N#W%Qo=YvsW#8#s zWTfD(FEVMqGyf8#p98Teyq}=Dj4F~T9Z)`l1?e`?S^fZM#f-F5^4vgj8KG==J#%j6 zSb)%%c!ZvM$nuUXN8%G3vlz`91|9ywKkmF=dB`3y{PrkW@dX>*!6Q|Gpj#Jr{@|Fp z=Do&mC;HV7Qt4LMNo7a^BS~G>Z}ngORk3X4^{zOtSzilb_MEJr8x|@};we;s-oPJ}$63?Cz^yB%_mZ|6%SbL3vG~#vS0p z#CC|vlT3o_T*lYTd$-&oIC`dpV++i^M)31S8`3XHOJKs7-6~Tcn=%jqbwY_fX9Ca# z0WjeAu8EtW?%~=3Q|&c`A2DjluWlZH3vbl@dHH9Az`4du(Afg9VU7PFEg^kWcA6gW zc9bI%jE^Es|12F>p=#aUDDMbfT8_l56X~?}bNxGA4)T(6hH=VXD3NAHjphgWF1DrE zDp(YG@LNc?Yy`zU{ubn~^5H-Mw5)Edv{!XVxf)ZZ*=Ie1`O+jgCdoZl8y}_N)xY{* zjJeY`$JJD(9uC(N=HRjL+vZ%aq1U7dF)sCUnzL z(o6ZcVV75<{siJ-3hVC~A8%{<^CO52$7Zw#hi_sJ`aviKz((^3e2l9KUa`j5GtB|J6cxiv8I8Ubx|KIyqhPqK~|B zu%?79y{WG3wma@wcgTC?Zi&GI01d*cGIkKjqJj0u31;BSBzfzuWF%cyq=hTFAJ4lW zZmiy}lxeJWGe9RHyA&qeVZz3v0X^d{+ddiOBa}}}thDrqIu1-@)9ey?rJfrl*JqTA zsTxzZCj!r_D2!WRu0ARAfnseTG1Z~%7WsFr5|K3fQ2!RkkNe7Q1BT0xC*3s{y%d3M zgnRXwTLww?DKk%Wu~VOr1=^qstj4W2ip<-Cfa1bT@7ic4VH3o>8Vwx0<2Uufsyq;T zt_F#9QdTU7PC>Y+6u1(^LRa?7=U;IsFtVq%l2D=}DW14y0oHW;R00lX&Jc(*^ zb;Q3?7pzc$WB)9OTEcHZ-pJk;?!X5qH+r1_@sm9-)%=Jety)czJ)}8^(z%2 z2@HosZR7XyPu)dFQxeu5raP-j(ig9HXA;(nmi;=38^7nqgsV0UB9bXzUQQJUI;-Dd zR|1kO-vFW76eCn4#W3agWqggCOV?-h3sB9I*XWx==#bsD;t3x}f}44#T`PfnU4PG` zPSz{njz<31)w<7+w#$h@xw$c-NG~Og01>{<>^_5e$R-=O%`_nP3C;RlK~-YGK-jsJ{zfeE$l5^j$Kk``x=vnC2>X&Hl*r6W)k%aUShR zUR;)>ILp6|w&h=Kxi7!lll(za|7FTHs!S3aJv!N9YdlgP8$aoZ{UR$AC^{6qRO9@8 zf3rW!wDC@F#QW4fPwg?f^Key(0et0A*#}9{XX4sr%0hK0&O*Hs_Q2b)!LyYF=HHXztU;B5oUdS=~(XvOcrJgc$xcArh0eMjF6z#`^s zyWgV8quGT#W*@?rLu&>>&*fp$E02-3Etin;>V`c`q&GKsP;zFiws+&1XRPM zChj)jE4>7pGhPZ}Sx>uIm;Ql*=G!o6h-KhrPnr2GvEfs~++~T6vRky|-i$AYFz7Cd z_jfQaSkbzU79aDWYTX@n0S4Bwg>ovrkNj+sLG;l;U&>FRp3-0_&KKRH9I~0AX|R8R zsVTTW+BtUehsTOJdpKe0In5D(u^BA1Xagu>=fljVsqyKP=dh2Hg_CI)$fJwnj+t1% zKCl*7*l2XMrln!bLUdl;4+?cbpkzU?32kyY! zQgHVhCm|f~my7JVmsOZ;PmE>c{&&D z86ahi6#PzE(PQgmFAYd0vbjX+im#v9A3!%7{8R9gjW1tPdn`LC6#nO4_+|uQA*Fp7 z(Tyoth3WoIVPWZ>ZuaqyLW#XgA2aWcR(^Fs?!8jOJSuSe0RMYLlnJF5@}o8E{#6>c zQ*#ZKbziCLv3DS(Hw=|3x9etAth#HWR;ixWi1YvnNFS8YlR1M3*%H?bX`qgXNdM0J zj**aQtuAITu`X`Wqn}u#f$10f5@?Bpt%n;$BEK2@izZ}iKGa%}C!lMc?JE`}y`~dp zXEgVD6Mio+eylER5~f|F`aNDANHwC9KIi6rK`YBxNk!g5$ zW3M(59%2dIa!aFnY)PO!Lwb64dn`8G@Hg^X`}0nk#@(rbppplrb)3S`>M4>Y~MIQ~h*P*=H3=siKzp=H>UIcO!1c=bcT4 zHWYIB;`0y~XNMi80}$w`!;`6gijvu?^mULsbNRbqA#}Eu_CmCWyQt|d*lYk}YpK}z z+k;r`x4m!6V|JG=qwcr*nqjF2*nPQt^X1`hLi!~&6mN$S?!SbS52GRNg7Rl!WE_cj z29jG{_C(71YD~HM1JY3#E#E&%bX1ag3dzA)HWrV~)2GE{lsy8}LRH@$$#6%ZXf0=x z;RVxTt@5H#O-OO|cx+{{gv00Xp>z{qST=t0Fkzq{!Y_D~kB1P_$1}Uxf=HbX+tM4- z-D#>n>w3vGpX);+l2r6Vh*(wDNUEjTNo6HSk9>d~5&%%QzXKnc`E^mkdmE6^3hVnJ zs(JUuyNXlSN;)m4{ze!JcFL*O7zXZvBgRv7*&tIc$dsSAWP9r+(JOT&We{Us8PLgZ zUQYzc0)+bdK)lKq%Bk)0|HOByMm2Ztx@ZUEV_g^^L3EE*|JJ6@)t?I9Lj4d|#`#{C1EX1+$4ykP8^Ld5+tiK5EwF$h_+gGQ3dezChi z?EL^Pvy#;c^z2mslQ&s%5VBEyC2B;0MBNMrm(w!nr5FoT$RRg`UF#s2lsK@mqNRN7K3gGx`62{Mwx6I7$wY5$T|eRFuOUDvF}RI~_18kq%Ro z!;a1h(UDR{l1fEU61F)Xb4<=Q$2o6i?7V&V`QiH?T({SCU9anUJ)V!p{gD$RFy0}_ zkfau(V$$RqQL}cVPgYtt1<$74xyc&MZkbkTqS#m|2MhoWr}xJNCV3~Yo4J5GdJ z2Dj+o39Q5q>4ojM8hf{mDUOEZcu;u8*b)tpkAk~V7#m>3R>WHePN>ksYF3>O#70Sp zd`T9)YSh2?jSe9qetS1G(zWn!qZrlRVTGCId`nQH7NMogm)WZhB0oXLQ+7k-DIzMK zm$~D#8nl)wY2>!qw=}0ZOU&jnOTBg|+T1t@TuhGy99UX_P6+wWtxcm|)bu?>!Z^Qf zOtP8f^l-2rhJV*gvi<{?CCg9wUZa*jNbI6iD6>wi$ZsqlUb2gRq4ukvae7sG8W!*1 zNWAHs%9Y0(c<4Th=ixUrwXD{xI$}LFOM0l)JXd(F7yV znWk6Ky`#AJe{r9wviN%k5O0U`?R6Zp^*zc_KV{jq-nBSI5nLtrx=7<$@kJYg)8PKo zhDtZm2^0%#p1ka7R5||XhS020dqw1DIeY>%}G_jK&xH@wYdd}fjc!RAcn(h>0 zf9-utvF0K5a)P__{BwhM?O5hM0LPjuv;uGivw@HVUG3%n_X5N_Te#Qf>D3HyU>dj# z+$c4%J`FkfBJs-GV>LP(B;0;YJQNSi?3HlGe<=x(N@Fj9@G6;8xO0O7{#QBTBfrbT zFR{{K{b`_G5mmxbQIaH#qVf~o2@V+GOStaI_)+ts+y1M1xRJ$LcER>-H2++6;jAlu zLWV*7D)gA+OzW>Y{3KO9Lpc66Az5Xf=k3!Pd-G-`)74IrJw0sw&LLa#wITQfOLb8D zA?3PMaJ&AHup&4IiG|bVp zvWOY82JvA@_Vs?#sRwDgfUN9Y&A*&A1W$ef>OyQ8y<@O_x03#eP!%U;dX5Db&9%>ZA+r0 z&;vzx#5*3NE#DoI_N6u;-KU!Jc)1M(w zC}i>8YGO{kDSxktPx$J}<62w2S#NJuC>U8gb>a7;yO+r=q-ryu^ID+R4dCV-K(m|Gf4;HY(tP`@c&TwRXhp*X3! z7Rou_{K@neM*`W)N|NHHASg@7P}if z1an5R2K52_Dw0mUuya6zaecXVGV{=Y`3|1JZoFtI3QHWsqZ>JP1$rh_!GWbUcsM1k zWc}7ed-3S$ek4uwjRP+9SHZSp4J;ItPuaASVAphHf#Y0(bU;@{F-ZPP>VM8e4)hsl0QkZVyuL_y|2z$`CnV zN)rQ0819~N`4O>jZ#_ra@%)$=u}3uaUCd>je%F6G3}1f(nSnofW@-!bTd}&td8T1J ztnfyeb+n^B0H}Egl#fLY#Cf_rAjq|H&YbKFW5>B`uP$b~uRt!oDGW+mRrqaiLEz+K zpIn4k#ACT_L$u?kW7N;d+iO@eK%))T=l6=c`F42Jn74~JQGXkOnBAifuBXy~XmGn&md zcov&fmmVT3T+L+6+gkl6U|b#{9PY64zPs29?z{6SwpNmDwS3$R=ZrTB6nm8S>1<*p)LmTH zZKVp7va`7mE*1l(;KL-0;qje2P9)}>)_;ZIwq~-b8E^6$$p&9TQzljYm?L zT@94*JeOkZam7kq-FvwdrjwWNrA#Z*OuQPfBBSDJMIPsdM#IgPNtlmJ>P8WuFH6Clk6JXoA&$ z)8LZ9^u?FC*C%$kwxP5lDDpwDjxQ6WyF?9jtvlV*u5X?(s#huy;xD#ycY1s`_9Jy2 z2MkhOa{L8<>o8ImR4b(!37?`Hz4aCLFiE1N z5tP5h6a#{f%1CgHPu4$x5cUb=bF+vGK&UrX0V{iUT!t*#)=f_qC#l3sQ!kF+p9Tmw zTrEERyXs~)`=zPHEjx!NT-Vk@-&c~g9l&}r{`g!(GsMpB2_(|56W&SfTeEAj&#h_O zHhCzr!CmraGuRm;8L!`N%ny6XK|OeYVWlXo!Id;C_#Ro?;`dVuc@D|hI{rP$t6pCiuGsgv1iQycjkvgDITeG6F&Jb z;+p9$aF9sF>kza&cJ+^|;_vkOGSW}2_||lq_tARV1w;3io3N2qA3N z40T}jeFTJ?oT;3xK&_O$jbB?&UWK2Q+~-WJTK5BmAD{Y7wi%nkWMvPWIlTq-WK=^R z_JC^=Ob%}mq_yBbV4zdI4jYLIXCclL&v#|)WlGO>M7X^F^187Wz9R)@17_be=l_{D zh5y2)IGsN^0%X)8b!xjda6fCNYA~syP=*1MTL{jnl@&7KG}z40B$YSwQbW2_ZJ^NX zde8Fu`~Q7Ozt2hK$EZnqs;d~&prYb}&!X7E%y*(EZ+RXY8MrgdYLkz?t+l>?9hkjA z8q`@Rlj{@dZGVhngRkLQ+pz#U;;ML0sKM3lw3LHhxNBXS3WbIKA3)^wb6!m?2PMM|)r!><(kn|Ehmv3aPrSL`?E>ID{q#Y9#?sQ$ zZGi79;1tIDPnDHHC#dWD1(zAhODJhgxFLqPpSvAlAnH*o1tjgqdFziO4h6|9%`f`acgMQmkO2&mV8 z_OdrC{EIGe^3GJPk|c<=1Dl+pWz=Xk?D0MN+o<>Z!x#eWK~cj7FIU0?_j+#D^}j-l)V2loG)+tfP0z1k@;Vt+FR+~^aIba z=84;#>E0w)=0w;Vnr`t|Xg+x5BL|Z&N_C3WRe}x2#cBzllNAE926SV@squyXn;Z(^>EL z{I&_v%%0Uq6 zvOT_dmRaG5#dPd(JiqS$=tqC+Zu_&WMS;>!*a#?0+2@bn9VPK>aUi2qvgpc;y_SO0 z9%CeNt_vJin)d+?x?*nTRv~t(_srPS&=&{g2#xI5ZxnPfYgxk7H^tVZ__d@GVYd(-yAx@&vY-rgYn+5ttH#WR8~cpEr}tSxl}iK_25 z=t}&4Pn0!XX)Ax}#-VrwWPxwZ!JA|5wCbsga@j>b+r*%>fba0t)xHS`cN{6|Ly9y2 zb%3KVE+V1H3sm^YI%*xPMZ7PTZVcm%UYB~i+JXQJW=>u2+NCWa2wUvQQJ~R}=q^BK zYyfSN7P(eAKv&=%0B_7Ke*3XF>u?j_DaoDH8@=$4#i~={2*=N&?y(EydygA32Xt#;jSh-fefc6?{;o3s zw`g2s;7Gr1D2TIyfjeB7y_UD%PcX(kr)W{~VjRa9ky(v&umvA|k3zq|ZOYEEWzFH{ zi{W)+`A*JNCY2fk-n0D1t+;KX}YX+2?(?d&8ex8SyS78E<-u zF|GJ2;|xAj!r*MWvo4?#)yUL0IRp^FAcxF-Fvk^)Zts-$_w@)07d5ua>tUX$>5CJpc?yNDF6JN*Isgp0 zqO%c{@&#d{kUxLDp7M5Sc$+68bgsVw*~8xUkHl&1?82KAd^eyR+~C~MDV`0~jT{48 z2-6#Z_7I9^^}WT0gWltul@UR`>wB_vqSWH*!xeBZFpTjCbOSK5VL8l$v~@}F3-q%i zbFL=lOpeEyvko@F2hI!jO;JN}f3>EKx~p9!bLaYZL1Si3_SL+@_Vq3`5iZj*e!)+R zoYoU8+q*UN-+T6oQ|gc>Met7hH{EJi@Bd5j?AUZ3ZULr$o;MF;tj%uN3Hgh8_FV3~ zD)nj&)KAtCqXWV-9AGi+q8@QgAwskw!2SgBDz-CNnMB#N*}0v+mVNPa!hBM8WmUMb z4voq{Gj#P`;?`k*{ASma!y{~uu0!|Ub*)Fb-GB0r?1s=8XtO>~J|!xgMmoMBX#f^f zaWrt87t#G3_l-a2f#W*M%09wL1>?6%@Im5@**I9BJ3gkd{E6ZE25oUJ@Yzw$2DwL` zwsEi$1>~r9c;esEM2)T;7)hKw8Hwo;9qT5mNE;I6l0->|kQ0M}_7Cxz{Po2}6w;hJ z8x*&rD})b{nLTi?X3J|EEB^02vvwE5V~@@2eGsZBMq143jj9gSuPt%|r99wv(jX^a z;~lNCjGX!Y1The7Klz3FdEwJqb@;%Q(PJ(W_YBT%Wt&6xTPKi%i@3H6(@8Rp!A{?a z(idYurKSL|Q0k1^3lL8*$KH?&*Su{S#4`YUrm-SG11^Bq*z4)6Zh@g9*Q{ zA9ozNSHeiJ-h&4TY!x2nNrv<*eKaZaJ z5>MVK`T9X#NJ=5tcCTB15@qqf)61lV+jXz3Sq`qkQzC^K*ypl;rVIHmlu(A?C>d}N z*=YG5`Zg%&og{HD!N8!F8EA8rc?Xmw+Ht%_?r)KufOq=w>SH%z<5bbrlVK$>L`)kUnatpDBUfh)Bnup>g!cxJE&RKn?GCQWP-=(TR?dq5QTL ze3%^VUcP;YQB)U%!kSEQOe%-{rKXK7HHGKgA5q<+H+c4}u)k9?C&LaQ_SW8zxs5~r zmDE}f2=1=BbM?~p0B|i|gOz{%1^!LK?20Fo4ow}G?rSZXm*(rNX6*Sy=wa^IGNKIRV0RX*vJVC! zpL!h&&q3h7QF!?@{@(AeThf6y3+FJA4)o`q8&|5!NXp@ya~hk=HZa?4FdxrtA~c+6 zp1deCX58_RiV{ApByk+rT4QL~9=^8*5cvAGG3_e?cV&?7yQSJ@NjqbUC-fPvVPlr& zqYk|Zq29^#@0-=NLbqtqW|JAt)*iWkga!DgSqf9OR?H!IGht@IdNZkOF=}6JXIH}1 z>ChNX?KZ_Y(yEP%Aj)(IU%!0mpfu!S7x4}H9J*`Y`s6^;sS>3ncq|kF_jo`6DCwAq zBs7O0r5DlAQ~}9#4ZA~9%-^O{hap1`caQ-Fvl9F2e`*h)- z{PeLTgE!(aPFE${{#igMpFE=?hHf#;V!II^Gn&30nt_|Q^2iGyPg_sXE3-q^x;ZUsknI*_D9nOIWy}W z7AE)mM#bW#Cy?eTnP>RMUgR()e%yWAU;OIdcz=iwH#?c2%XbJzcILH{T@ma&4xifc zkTSt>Hc*ur{6ALe`$WeFO6T#+ z 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 z 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%0DSWr-)`}n$xc?-7hjy3THa`H;+ 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 diff --git a/plugins/TinyMCE/icons/placeholder.xcf b/plugins/TinyMCE/icons/placeholder.xcf deleted file mode 100644 index e05f8a9c98109944aac04139eb53469b67d2b4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691137 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%0AYLYL=$*Af3{# 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≫nKUW!~xE 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%0Aa>)4FuNReo{&oTJ$a{Jde=<=$ZBMMbrr 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

    O- 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 vUKWY!Q62nEm)CP)=Kt6 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

    !a;ESM3TP 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 diff --git a/plugins/TinyMCE/js/jquery.tinymce.js b/plugins/TinyMCE/js/jquery.tinymce.js deleted file mode 100644 index 4866c2a06b..0000000000 --- a/plugins/TinyMCE/js/jquery.tinymce.js +++ /dev/null @@ -1 +0,0 @@ -(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);if(v){s.onInit.add(function(){var x,y=v;if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}})}});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery); \ No newline at end of file diff --git a/plugins/TinyMCE/js/langs/en.js b/plugins/TinyMCE/js/langs/en.js deleted file mode 100644 index 8a80d46b1a..0000000000 --- a/plugins/TinyMCE/js/langs/en.js +++ /dev/null @@ -1,223 +0,0 @@ -tinyMCE.addI18n({en:{ -common:{ -edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?", -apply:"Apply", -insert:"Insert", -update:"Update", -cancel:"Cancel", -close:"Close", -browse:"Browse", -class_name:"Class", -not_set:"-- Not set --", -clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?", -clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.", -popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", -invalid_data:"{#field} is invalid", -invalid_data_number:"{#field} must be a number", -invalid_data_min:"{#field} must be a number greater than {#min}", -invalid_data_size:"{#field} must be a number or percentage", -more_colors:"More colors" -}, -colors:{ -'000000':'Black', -'993300':'Burnt orange', -'333300':'Dark olive', -'003300':'Dark green', -'003366':'Dark azure', -'000080':'Navy Blue', -'333399':'Indigo', -'333333':'Very dark gray', -'800000':'Maroon', -'FF6600':'Orange', -'808000':'Olive', -'008000':'Green', -'008080':'Teal', -'0000FF':'Blue', -'666699':'Grayish blue', -'808080':'Gray', -'FF0000':'Red', -'FF9900':'Amber', -'99CC00':'Yellow green', -'339966':'Sea green', -'33CCCC':'Turquoise', -'3366FF':'Royal blue', -'800080':'Purple', -'999999':'Medium gray', -'FF00FF':'Magenta', -'FFCC00':'Gold', -'FFFF00':'Yellow', -'00FF00':'Lime', -'00FFFF':'Aqua', -'00CCFF':'Sky blue', -'993366':'Brown', -'C0C0C0':'Silver', -'FF99CC':'Pink', -'FFCC99':'Peach', -'FFFF99':'Light yellow', -'CCFFCC':'Pale green', -'CCFFFF':'Pale cyan', -'99CCFF':'Light sky blue', -'CC99FF':'Plum', -'FFFFFF':'White' -}, -contextmenu:{ -align:"Alignment", -left:"Left", -center:"Center", -right:"Right", -full:"Full" -}, -insertdatetime:{ -date_fmt:"%Y-%m-%d", -time_fmt:"%H:%M:%S", -insertdate_desc:"Insert date", -inserttime_desc:"Insert time", -months_long:"January,February,March,April,May,June,July,August,September,October,November,December", -months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", -day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday", -day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun" -}, -print:{ -print_desc:"Print" -}, -preview:{ -preview_desc:"Preview" -}, -directionality:{ -ltr_desc:"Direction left to right", -rtl_desc:"Direction right to left" -}, -layer:{ -insertlayer_desc:"Insert new layer", -forward_desc:"Move forward", -backward_desc:"Move backward", -absolute_desc:"Toggle absolute positioning", -content:"New layer..." -}, -save:{ -save_desc:"Save", -cancel_desc:"Cancel all changes" -}, -nonbreaking:{ -nonbreaking_desc:"Insert non-breaking space character" -}, -iespell:{ -iespell_desc:"Run spell checking", -download:"ieSpell not detected. Do you want to install it now?" -}, -advhr:{ -advhr_desc:"Horizontal rule" -}, -emotions:{ -emotions_desc:"Emotions" -}, -searchreplace:{ -search_desc:"Find", -replace_desc:"Find/Replace" -}, -advimage:{ -image_desc:"Insert/edit image" -}, -advlink:{ -link_desc:"Insert/edit link" -}, -xhtmlxtras:{ -cite_desc:"Citation", -abbr_desc:"Abbreviation", -acronym_desc:"Acronym", -del_desc:"Deletion", -ins_desc:"Insertion", -attribs_desc:"Insert/Edit Attributes" -}, -style:{ -desc:"Edit CSS Style" -}, -paste:{ -paste_text_desc:"Paste as Plain Text", -paste_word_desc:"Paste from Word", -selectall_desc:"Select All", -plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.", -plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode." -}, -paste_dlg:{ -text_title:"Use CTRL+V on your keyboard to paste the text into the window.", -text_linebreaks:"Keep linebreaks", -word_title:"Use CTRL+V on your keyboard to paste the text into the window." -}, -table:{ -desc:"Inserts a new table", -row_before_desc:"Insert row before", -row_after_desc:"Insert row after", -delete_row_desc:"Delete row", -col_before_desc:"Insert column before", -col_after_desc:"Insert column after", -delete_col_desc:"Remove column", -split_cells_desc:"Split merged table cells", -merge_cells_desc:"Merge table cells", -row_desc:"Table row properties", -cell_desc:"Table cell properties", -props_desc:"Table properties", -paste_row_before_desc:"Paste table row before", -paste_row_after_desc:"Paste table row after", -cut_row_desc:"Cut table row", -copy_row_desc:"Copy table row", -del:"Delete table", -row:"Row", -col:"Column", -cell:"Cell" -}, -autosave:{ -unload_msg:"The changes you made will be lost if you navigate away from this page.", -restore_content:"Restore auto-saved content.", -warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?." -}, -fullscreen:{ -desc:"Toggle fullscreen mode" -}, -media:{ -desc:"Insert / edit embedded media", -edit:"Edit embedded media" -}, -fullpage:{ -desc:"Document properties" -}, -template:{ -desc:"Insert predefined template content" -}, -visualchars:{ -desc:"Visual control characters on/off." -}, -spellchecker:{ -desc:"Toggle spellchecker", -menu:"Spellchecker settings", -ignore_word:"Ignore word", -ignore_words:"Ignore all", -langs:"Languages", -wait:"Please wait...", -sug:"Suggestions", -no_sug:"No suggestions", -no_mpell:"No misspellings found.", -learn_word:"Learn word" -}, -pagebreak:{ -desc:"Insert page break." -}, -advlist:{ -types:"Types", -def:"Default", -lower_alpha:"Lower alpha", -lower_greek:"Lower greek", -lower_roman:"Lower roman", -upper_alpha:"Upper alpha", -upper_roman:"Upper roman", -circle:"Circle", -disc:"Disc", -square:"Square" -}, -aria:{ -rich_text_area:"Rich Text Area" -}, -wordcount:{ -words: 'Words: ' -} -}}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/license.txt b/plugins/TinyMCE/js/license.txt deleted file mode 100644 index 60d6d4c8f5..0000000000 --- a/plugins/TinyMCE/js/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/plugins/TinyMCE/js/plugins/advhr/css/advhr.css b/plugins/TinyMCE/js/plugins/advhr/css/advhr.css deleted file mode 100644 index 0e22834985..0000000000 --- a/plugins/TinyMCE/js/plugins/advhr/css/advhr.css +++ /dev/null @@ -1,5 +0,0 @@ -input.radio {border:1px none #000; background:transparent; vertical-align:middle;} -.panel_wrapper div.current {height:80px;} -#width {width:50px; vertical-align:middle;} -#width2 {width:50px; vertical-align:middle;} -#size {width:100px;} diff --git a/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js b/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js deleted file mode 100644 index 4d3b062dee..0000000000 --- a/plugins/TinyMCE/js/plugins/advhr/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js deleted file mode 100644 index 0c652d3303..0000000000 --- a/plugins/TinyMCE/js/plugins/advhr/editor_plugin_src.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedHRPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceAdvancedHr', function() { - ed.windowManager.open({ - file : url + '/rule.htm', - width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)), - height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('advhr', { - title : 'advhr.advhr_desc', - cmd : 'mceAdvancedHr' - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('advhr', n.nodeName == 'HR'); - }); - - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'HR') - ed.selection.select(e); - }); - }, - - getInfo : function() { - return { - longname : 'Advanced HR', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advhr/js/rule.js b/plugins/TinyMCE/js/plugins/advhr/js/rule.js deleted file mode 100644 index b6cbd66c75..0000000000 --- a/plugins/TinyMCE/js/plugins/advhr/js/rule.js +++ /dev/null @@ -1,43 +0,0 @@ -var AdvHRDialog = { - init : function(ed) { - var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w; - - w = dom.getAttrib(n, 'width'); - f.width.value = w ? parseInt(w) : (dom.getStyle('width') || ''); - f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || ''; - f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width'); - selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px'); - }, - - update : function() { - var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = ''; - - h = ' - - - {#advhr.advhr_desc} - - - - - - - -

    - - -
    -
    - - - - - - - - - - - - - -
    - - - -
    -
    -
    - -
    - - -
    - - - diff --git a/plugins/TinyMCE/js/plugins/advimage/css/advimage.css b/plugins/TinyMCE/js/plugins/advimage/css/advimage.css deleted file mode 100644 index 0a6251a696..0000000000 --- a/plugins/TinyMCE/js/plugins/advimage/css/advimage.css +++ /dev/null @@ -1,13 +0,0 @@ -#src_list, #over_list, #out_list {width:280px;} -.mceActionPanel {margin-top:7px;} -.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;} -.checkbox {border:0;} -.panel_wrapper div.current {height:305px;} -#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;} -#align, #classlist {width:150px;} -#width, #height {vertical-align:middle; width:50px; text-align:center;} -#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;} -#class_list {width:180px;} -input {width: 280px;} -#constrain, #onmousemovecheck {width:auto;} -#id, #dir, #lang, #usemap, #longdesc {width:200px;} diff --git a/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js b/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js deleted file mode 100644 index 4c7a9c3a88..0000000000 --- a/plugins/TinyMCE/js/plugins/advimage/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advimage/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advimage/editor_plugin_src.js deleted file mode 100644 index 2625dd2131..0000000000 --- a/plugins/TinyMCE/js/plugins/advimage/editor_plugin_src.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedImagePlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceAdvImage', function() { - // Internal image object like a flash placeholder - if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) - return; - - ed.windowManager.open({ - file : url + '/image.htm', - width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)), - height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('image', { - title : 'advimage.image_desc', - cmd : 'mceAdvImage' - }); - }, - - getInfo : function() { - return { - longname : 'Advanced image', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advimage/image.htm b/plugins/TinyMCE/js/plugins/advimage/image.htm deleted file mode 100644 index ed16b3d4a9..0000000000 --- a/plugins/TinyMCE/js/plugins/advimage/image.htm +++ /dev/null @@ -1,235 +0,0 @@ - - - - {#advimage_dlg.dialog_title} - - - - - - - - - - -
    - - -
    -
    -
    - {#advimage_dlg.general} - - - - - - - - - - - - - - - - - - - -
    - -
    - {#advimage_dlg.preview} - -
    -
    - -
    -
    - {#advimage_dlg.tab_appearance} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - {#advimage_dlg.example_img} - Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam - nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum - edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam - erat volutpat. -
    -
    - - x - - px -
      - - - - -
    -
    -
    -
    - -
    -
    - {#advimage_dlg.swap_image} - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
     
    - - - - -
     
    -
    - -
    - {#advimage_dlg.misc} - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - - - - -
     
    -
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/advimage/img/sample.gif b/plugins/TinyMCE/js/plugins/advimage/img/sample.gif deleted file mode 100644 index 53bf6890b507741c10910c9e2217ad8247b98e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1624 zcmV-e2B-N)Nk%w1VJ!eH0OkMy|NsB}{r&v>{Q3F$`1ttq^YifV@ayaA>FMd_=H}w! z;^5%m-rnBb-QC>W+}qpR+S=OL+1c3G*w@$B*4Eb4)YQ|{)zHw=&d$%x&CScp%gV~i z$;rvc$jHXV#>B+L!^6YE!otD9!N9=4zrVk|y}i7=yt})*y1Kf#xw*Hux3;#nwY9ah zw6wFcv$C?Xv9YnRu&}SMudc4Ht*x!BtgNf6tE#H1si~={sjjD|r>3T+rKP2$q@<&x zqobp!qN1Xqp`oFnrJ$goprE6lpP!zdp`MSWoSd7Ro12@UnwpxLnw^=MnV6WE zmzS58mX?*3mz9;3mX?*2l$4W`lai8@l9G~eg|M^H&l zLpBo?51@vfgB2q_TVh*dNP<;cR$Wg!vYsMHR!qvvOis>GNH`+ zJ3B|tqgANiBSy@x>Q#;x7+DuU7&rwlf#S04)VZvA$XoUy8Y&f7)SqP<}Lw@L# zA(@Cohl`6CZyedUu^BlmK|DG5$Kl2f8z@uCc)^k-3m7$G!njf7$;XhOW>^`rV#UFh zEN#eG;bP?tCs>{+)q)ceg9$aDAaTZ{MGK5rU8ty$qz8){MT#gHGX{#XEJHLonBXFa zj+#9GE&^pq!`qG`K5iiC!gq}sRY|1yD8?j++_^oR0g+)NNtZN`)08!0q=}AA4HhIo zFaa9NYu8%97=oos5f?O`lwre~4VfoIei+FyK|urxj@C(-q(sS(!$5uL3j&jg7&XY% zlr17;3GGL;2K8>CB87G97;W(2VZ((D+3Hz;L;bylfhf(kFNV8at)h;hdM z85WX(#*Hq@@BYePt3t_l{ zCL3|YVWydA0Fz{rTl65n00)c^)^-jJn1c zRVXtA6mkUMEDLU|v7{JK&_IJ2ciiCy7BOT1fdUBh8b=yrbYaCAchCU_7?H`b1`}4q zLB|_mI2!;7W4QCq6F1O+MW||6AwmKafUrReUA&QotxQZI8D$G)AuSVV@X<&A9v;~H zKnWjo&;bljq=29aCeV-t5GBYkL=Q}q(S~FLd2t39MyRmC%_GFHkPc7CfIt8P*emqV z0YK2j9A+kmW^!tn(ZmG+L=6DZR99W}8p9?Utr=#t@rE2=zxf3QQ(JBJ&<{Z2>8EUP zeX1B)2w_3gXV)D-0Tt+=#@cV-0f!PU#MglZ3m6b}0e08zK^x;9(u?Tga{%?&nNTXhcEuM_#J>yL>p*a zuZJ2pliCGSp!Ye8>YFq@)ZOW-uT~OrjFQK!)UyVGFt7ni'); - }, - - init : function(ed) { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'); - - tinyMCEPopup.resizeToInnerSize(); - this.fillClassList('class_list'); - this.fillFileList('src_list', fl); - this.fillFileList('over_list', fl); - this.fillFileList('out_list', fl); - TinyMCE_EditableSelects.init(); - - if (n.nodeName == 'IMG') { - nl.src.value = dom.getAttrib(n, 'src'); - nl.width.value = dom.getAttrib(n, 'width'); - nl.height.value = dom.getAttrib(n, 'height'); - nl.alt.value = dom.getAttrib(n, 'alt'); - nl.title.value = dom.getAttrib(n, 'title'); - nl.vspace.value = this.getAttrib(n, 'vspace'); - nl.hspace.value = this.getAttrib(n, 'hspace'); - nl.border.value = this.getAttrib(n, 'border'); - selectByValue(f, 'align', this.getAttrib(n, 'align')); - selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true); - nl.style.value = dom.getAttrib(n, 'style'); - nl.id.value = dom.getAttrib(n, 'id'); - nl.dir.value = dom.getAttrib(n, 'dir'); - nl.lang.value = dom.getAttrib(n, 'lang'); - nl.usemap.value = dom.getAttrib(n, 'usemap'); - nl.longdesc.value = dom.getAttrib(n, 'longdesc'); - nl.insert.value = ed.getLang('update'); - - if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover'))) - nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); - - if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout'))) - nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); - - if (ed.settings.inline_styles) { - // Move attribs to styles - if (dom.getAttrib(n, 'align')) - this.updateStyle('align'); - - if (dom.getAttrib(n, 'hspace')) - this.updateStyle('hspace'); - - if (dom.getAttrib(n, 'border')) - this.updateStyle('border'); - - if (dom.getAttrib(n, 'vspace')) - this.updateStyle('vspace'); - } - } - - // Setup browse button - document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); - if (isVisible('srcbrowser')) - document.getElementById('src').style.width = '260px'; - - // Setup browse button - document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image'); - if (isVisible('overbrowser')) - document.getElementById('onmouseoversrc').style.width = '260px'; - - // Setup browse button - document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image'); - if (isVisible('outbrowser')) - document.getElementById('onmouseoutsrc').style.width = '260px'; - - // If option enabled default contrain proportions to checked - if (ed.getParam("advimage_constrain_proportions", true)) - f.constrain.checked = true; - - // Check swap image if valid data - if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) - this.setSwapImage(true); - else - this.setSwapImage(false); - - this.changeAppearance(); - this.showPreviewImage(nl.src.value, 1); - }, - - insert : function(file, title) { - var ed = tinyMCEPopup.editor, t = this, f = document.forms[0]; - - if (f.src.value === '') { - if (ed.selection.getNode().nodeName == 'IMG') { - ed.dom.remove(ed.selection.getNode()); - ed.execCommand('mceRepaint'); - } - - tinyMCEPopup.close(); - return; - } - - if (tinyMCEPopup.getParam("accessibility_warnings", 1)) { - if (!f.alt.value) { - tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) { - if (s) - t.insertAndClose(); - }); - - return; - } - } - - t.insertAndClose(); - }, - - insertAndClose : function() { - var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el; - - tinyMCEPopup.restoreSelection(); - - // Fixes crash in Safari - if (tinymce.isWebKit) - ed.getWin().focus(); - - if (!ed.settings.inline_styles) { - args = { - vspace : nl.vspace.value, - hspace : nl.hspace.value, - border : nl.border.value, - align : getSelectValue(f, 'align') - }; - } else { - // Remove deprecated values - args = { - vspace : '', - hspace : '', - border : '', - align : '' - }; - } - - tinymce.extend(args, { - src : nl.src.value.replace(/ /g, '%20'), - width : nl.width.value, - height : nl.height.value, - alt : nl.alt.value, - title : nl.title.value, - 'class' : getSelectValue(f, 'class_list'), - style : nl.style.value, - id : nl.id.value, - dir : nl.dir.value, - lang : nl.lang.value, - usemap : nl.usemap.value, - longdesc : nl.longdesc.value - }); - - args.onmouseover = args.onmouseout = ''; - - if (f.onmousemovecheck.checked) { - if (nl.onmouseoversrc.value) - args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';"; - - if (nl.onmouseoutsrc.value) - args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';"; - } - - el = ed.selection.getNode(); - - if (el && el.nodeName == 'IMG') { - ed.dom.setAttribs(el, args); - } else { - ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); - ed.dom.setAttribs('__mce_tmp', args); - ed.dom.setAttrib('__mce_tmp', 'id', ''); - ed.undoManager.add(); - } - - tinyMCEPopup.editor.execCommand('mceRepaint'); - tinyMCEPopup.editor.focus(); - tinyMCEPopup.close(); - }, - - getAttrib : function(e, at) { - var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; - - if (ed.settings.inline_styles) { - switch (at) { - case 'align': - if (v = dom.getStyle(e, 'float')) - return v; - - if (v = dom.getStyle(e, 'vertical-align')) - return v; - - break; - - case 'hspace': - v = dom.getStyle(e, 'margin-left') - v2 = dom.getStyle(e, 'margin-right'); - - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'vspace': - v = dom.getStyle(e, 'margin-top') - v2 = dom.getStyle(e, 'margin-bottom'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'border': - v = 0; - - tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { - sv = dom.getStyle(e, 'border-' + sv + '-width'); - - // False or not the same as prev - if (!sv || (sv != v && v !== 0)) { - v = 0; - return false; - } - - if (sv) - v = sv; - }); - - if (v) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - } - } - - if (v = dom.getAttrib(e, at)) - return v; - - return ''; - }, - - setSwapImage : function(st) { - var f = document.forms[0]; - - f.onmousemovecheck.checked = st; - setBrowserDisabled('overbrowser', !st); - setBrowserDisabled('outbrowser', !st); - - if (f.over_list) - f.over_list.disabled = !st; - - if (f.out_list) - f.out_list.disabled = !st; - - f.onmouseoversrc.disabled = !st; - f.onmouseoutsrc.disabled = !st; - }, - - fillClassList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { - cl = []; - - tinymce.each(v.split(';'), function(v) { - var p = v.split('='); - - cl.push({'title' : p[0], 'class' : p[1]}); - }); - } else - cl = tinyMCEPopup.editor.dom.getClasses(); - - if (cl.length > 0) { - lst.options.length = 0; - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - - tinymce.each(cl, function(o) { - lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = typeof(l) === 'function' ? l() : window[l]; - lst.options.length = 0; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - resetImageData : function() { - var f = document.forms[0]; - - f.elements.width.value = f.elements.height.value = ''; - }, - - updateImageData : function(img, st) { - var f = document.forms[0]; - - if (!st) { - f.elements.width.value = img.width; - f.elements.height.value = img.height; - } - - this.preloadImg = img; - }, - - changeAppearance : function() { - var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg'); - - if (img) { - if (ed.getParam('inline_styles')) { - ed.dom.setAttrib(img, 'style', f.style.value); - } else { - img.align = f.align.value; - img.border = f.border.value; - img.hspace = f.hspace.value; - img.vspace = f.vspace.value; - } - } - }, - - changeHeight : function() { - var f = document.forms[0], tp, t = this; - - if (!f.constrain.checked || !t.preloadImg) { - return; - } - - if (f.width.value == "" || f.height.value == "") - return; - - tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height; - f.height.value = tp.toFixed(0); - }, - - changeWidth : function() { - var f = document.forms[0], tp, t = this; - - if (!f.constrain.checked || !t.preloadImg) { - return; - } - - if (f.width.value == "" || f.height.value == "") - return; - - tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width; - f.width.value = tp.toFixed(0); - }, - - updateStyle : function(ty) { - var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); - - if (tinyMCEPopup.editor.settings.inline_styles) { - // Handle align - if (ty == 'align') { - dom.setStyle(img, 'float', ''); - dom.setStyle(img, 'vertical-align', ''); - - v = getSelectValue(f, 'align'); - if (v) { - if (v == 'left' || v == 'right') - dom.setStyle(img, 'float', v); - else - img.style.verticalAlign = v; - } - } - - // Handle border - if (ty == 'border') { - b = img.style.border ? img.style.border.split(' ') : []; - bStyle = dom.getStyle(img, 'border-style'); - bColor = dom.getStyle(img, 'border-color'); - - dom.setStyle(img, 'border', ''); - - v = f.border.value; - if (v || v == '0') { - if (v == '0') - img.style.border = isIE ? '0' : '0 none none'; - else { - if (b.length == 3 && b[isIE ? 2 : 1]) - bStyle = b[isIE ? 2 : 1]; - else if (!bStyle || bStyle == 'none') - bStyle = 'solid'; - if (b.length == 3 && b[isIE ? 0 : 2]) - bColor = b[isIE ? 0 : 2]; - else if (!bColor || bColor == 'none') - bColor = 'black'; - img.style.border = v + 'px ' + bStyle + ' ' + bColor; - } - } - } - - // Handle hspace - if (ty == 'hspace') { - dom.setStyle(img, 'marginLeft', ''); - dom.setStyle(img, 'marginRight', ''); - - v = f.hspace.value; - if (v) { - img.style.marginLeft = v + 'px'; - img.style.marginRight = v + 'px'; - } - } - - // Handle vspace - if (ty == 'vspace') { - dom.setStyle(img, 'marginTop', ''); - dom.setStyle(img, 'marginBottom', ''); - - v = f.vspace.value; - if (v) { - img.style.marginTop = v + 'px'; - img.style.marginBottom = v + 'px'; - } - } - - // Merge - dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img'); - } - }, - - changeMouseMove : function() { - }, - - showPreviewImage : function(u, st) { - if (!u) { - tinyMCEPopup.dom.setHTML('prev', ''); - return; - } - - if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true)) - this.resetImageData(); - - u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u); - - if (!st) - tinyMCEPopup.dom.setHTML('prev', ''); - else - tinyMCEPopup.dom.setHTML('prev', ''); - } -}; - -ImageDialog.preInit(); -tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js deleted file mode 100644 index d8f11e0303..0000000000 --- a/plugins/TinyMCE/js/plugins/advimage/langs/en_dlg.js +++ /dev/null @@ -1,45 +0,0 @@ -tinyMCE.addI18n('en.advimage_dlg',{ -tab_general:"General", -tab_appearance:"Appearance", -tab_advanced:"Advanced", -general:"General", -title:"Title", -preview:"Preview", -constrain_proportions:"Constrain proportions", -langdir:"Language direction", -langcode:"Language code", -long_desc:"Long description link", -style:"Style", -classes:"Classes", -ltr:"Left to right", -rtl:"Right to left", -id:"Id", -map:"Image map", -swap_image:"Swap image", -alt_image:"Alternative image", -mouseover:"for mouse over", -mouseout:"for mouse out", -misc:"Miscellaneous", -example_img:"Appearance preview image", -missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.", -dialog_title:"Insert/edit image", -src:"Image URL", -alt:"Image description", -list:"Image list", -border:"Border", -dimensions:"Dimensions", -width:"Width", -height:"Height", -vspace:"Vertical space", -hspace:"Horizontal space", -align:"Alignment", -align_baseline:"Baseline", -align_top:"Top", -align_middle:"Middle", -align_bottom:"Bottom", -align_texttop:"Text top", -align_textbottom:"Text bottom", -align_left:"Left", -align_right:"Right", -image_list:"Image list" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/css/advlink.css b/plugins/TinyMCE/js/plugins/advlink/css/advlink.css deleted file mode 100644 index 14364316a1..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/css/advlink.css +++ /dev/null @@ -1,8 +0,0 @@ -.mceLinkList, .mceAnchorList, #targetlist {width:280px;} -.mceActionPanel {margin-top:7px;} -.panel_wrapper div.current {height:320px;} -#classlist, #title, #href {width:280px;} -#popupurl, #popupname {width:200px;} -#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;} -#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;} -#events_panel input {width:200px;} diff --git a/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js b/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js deleted file mode 100644 index 983fe5a9ca..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js deleted file mode 100644 index 14e46a7629..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/editor_plugin_src.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AdvancedLinkPlugin', { - init : function(ed, url) { - this.editor = ed; - - // Register commands - ed.addCommand('mceAdvLink', function() { - var se = ed.selection; - - // No selection and not in link - if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) - return; - - ed.windowManager.open({ - file : url + '/link.htm', - width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)), - height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('link', { - title : 'advlink.link_desc', - cmd : 'mceAdvLink' - }); - - ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink'); - - ed.onNodeChange.add(function(ed, cm, n, co) { - cm.setDisabled('link', co && n.nodeName != 'A'); - cm.setActive('link', n.nodeName == 'A' && !n.name); - }); - }, - - getInfo : function() { - return { - longname : 'Advanced link', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/js/advlink.js b/plugins/TinyMCE/js/plugins/advlink/js/advlink.js deleted file mode 100644 index 837c937c66..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/js/advlink.js +++ /dev/null @@ -1,532 +0,0 @@ -/* Functions for the advlink plugin popup */ - -tinyMCEPopup.requireLangPack(); - -var templates = { - "window.open" : "window.open('${url}','${target}','${options}')" -}; - -function preinit() { - var url; - - if (url = tinyMCEPopup.getParam("external_link_list_url")) - document.write(''); -} - -function changeClass() { - var f = document.forms[0]; - - f.classes.value = getSelectValue(f, 'classlist'); -} - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - var formObj = document.forms[0]; - var inst = tinyMCEPopup.editor; - var elm = inst.selection.getNode(); - var action = "insert"; - var html; - - document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); - document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); - document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); - - // Link list - html = getLinkListHTML('linklisthref','href'); - if (html == "") - document.getElementById("linklisthrefrow").style.display = 'none'; - else - document.getElementById("linklisthrefcontainer").innerHTML = html; - - // Anchor list - html = getAnchorListHTML('anchorlist','href'); - if (html == "") - document.getElementById("anchorlistrow").style.display = 'none'; - else - document.getElementById("anchorlistcontainer").innerHTML = html; - - // Resize some elements - if (isVisible('hrefbrowser')) - document.getElementById('href').style.width = '260px'; - - if (isVisible('popupurlbrowser')) - document.getElementById('popupurl').style.width = '180px'; - - elm = inst.dom.getParent(elm, "A"); - if (elm != null && elm.nodeName == "A") - action = "update"; - - formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); - - setPopupControlsDisabled(true); - - if (action == "update") { - var href = inst.dom.getAttrib(elm, 'href'); - var onclick = inst.dom.getAttrib(elm, 'onclick'); - - // Setup form data - setFormValue('href', href); - setFormValue('title', inst.dom.getAttrib(elm, 'title')); - setFormValue('id', inst.dom.getAttrib(elm, 'id')); - setFormValue('style', inst.dom.getAttrib(elm, "style")); - setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); - setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); - setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); - setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); - setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); - setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); - setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); - setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); - setFormValue('type', inst.dom.getAttrib(elm, 'type')); - setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', onclick); - setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); - setFormValue('target', inst.dom.getAttrib(elm, 'target')); - setFormValue('classes', inst.dom.getAttrib(elm, 'class')); - - // Parse onclick data - if (onclick != null && onclick.indexOf('window.open') != -1) - parseWindowOpen(onclick); - else - parseFunction(onclick); - - // Select by the values - selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir')); - selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); - selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); - selectByValue(formObj, 'linklisthref', href); - - if (href.charAt(0) == '#') - selectByValue(formObj, 'anchorlist', href); - - addClassesToList('classlist', 'advlink_styles'); - - selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); - selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); - } else - addClassesToList('classlist', 'advlink_styles'); -} - -function checkPrefix(n) { - if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) - n.value = 'mailto:' + n.value; - - if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) - n.value = 'http://' + n.value; -} - -function setFormValue(name, value) { - document.forms[0].elements[name].value = value; -} - -function parseWindowOpen(onclick) { - var formObj = document.forms[0]; - - // Preprocess center code - if (onclick.indexOf('return false;') != -1) { - formObj.popupreturn.checked = true; - onclick = onclick.replace('return false;', ''); - } else - formObj.popupreturn.checked = false; - - var onClickData = parseLink(onclick); - - if (onClickData != null) { - formObj.ispopup.checked = true; - setPopupControlsDisabled(false); - - var onClickWindowOptions = parseOptions(onClickData['options']); - var url = onClickData['url']; - - formObj.popupname.value = onClickData['target']; - formObj.popupurl.value = url; - formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); - formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); - - formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); - formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); - - if (formObj.popupleft.value.indexOf('screen') != -1) - formObj.popupleft.value = "c"; - - if (formObj.popuptop.value.indexOf('screen') != -1) - formObj.popuptop.value = "c"; - - formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; - formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; - formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; - formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; - formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; - formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; - formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; - - buildOnClick(); - } -} - -function parseFunction(onclick) { - var formObj = document.forms[0]; - var onClickData = parseLink(onclick); - - // TODO: Add stuff here -} - -function getOption(opts, name) { - return typeof(opts[name]) == "undefined" ? "" : opts[name]; -} - -function setPopupControlsDisabled(state) { - var formObj = document.forms[0]; - - formObj.popupname.disabled = state; - formObj.popupurl.disabled = state; - formObj.popupwidth.disabled = state; - formObj.popupheight.disabled = state; - formObj.popupleft.disabled = state; - formObj.popuptop.disabled = state; - formObj.popuplocation.disabled = state; - formObj.popupscrollbars.disabled = state; - formObj.popupmenubar.disabled = state; - formObj.popupresizable.disabled = state; - formObj.popuptoolbar.disabled = state; - formObj.popupstatus.disabled = state; - formObj.popupreturn.disabled = state; - formObj.popupdependent.disabled = state; - - setBrowserDisabled('popupurlbrowser', state); -} - -function parseLink(link) { - link = link.replace(new RegExp(''', 'g'), "'"); - - var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); - - // Is function name a template function - var template = templates[fnName]; - if (template) { - // Build regexp - var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); - var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; - var replaceStr = ""; - for (var i=0; i'); - for (var i=0; i' + name + ''; - } - - if (html == "") - return ""; - - html = ''; - - return html; -} - -function insertAction() { - var inst = tinyMCEPopup.editor; - var elm, elementArray, i; - - elm = inst.selection.getNode(); - checkPrefix(document.forms[0].href); - - elm = inst.dom.getParent(elm, "A"); - - // Remove element if there is no href - if (!document.forms[0].href.value) { - i = inst.selection.getBookmark(); - inst.dom.remove(elm, 1); - inst.selection.moveToBookmark(i); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - return; - } - - // Create new anchor elements - if (elm == null) { - inst.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); - - elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); - for (i=0; i' + tinyMCELinkList[i][0] + ''; - - html += ''; - - return html; - - // tinyMCE.debug('-- image list start --', html, '-- image list end --'); -} - -function getTargetListHTML(elm_id, target_form_element) { - var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); - var html = ''; - - html += ''; - - return html; -} - -// While loading -preinit(); -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js deleted file mode 100644 index 19dff29363..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/langs/en_dlg.js +++ /dev/null @@ -1,54 +0,0 @@ -tinyMCE.addI18n('en.advlink_dlg',{ -title:"Insert/edit link", -url:"Link URL", -target:"Target", -titlefield:"Title", -is_email:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", -is_external:"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", -list:"Link list", -general_tab:"General", -popup_tab:"Popup", -events_tab:"Events", -advanced_tab:"Advanced", -general_props:"General properties", -popup_props:"Popup properties", -event_props:"Events", -advanced_props:"Advanced properties", -popup_opts:"Options", -anchor_names:"Anchors", -target_same:"Open in this window / frame", -target_parent:"Open in parent window / frame", -target_top:"Open in top frame (replaces all frames)", -target_blank:"Open in new window", -popup:"Javascript popup", -popup_url:"Popup URL", -popup_name:"Window name", -popup_return:"Insert 'return false'", -popup_scrollbars:"Show scrollbars", -popup_statusbar:"Show status bar", -popup_toolbar:"Show toolbars", -popup_menubar:"Show menu bar", -popup_location:"Show location bar", -popup_resizable:"Make window resizable", -popup_dependent:"Dependent (Mozilla/Firefox only)", -popup_size:"Size", -width:"Width", -height:"Height", -popup_position:"Position (X/Y)", -id:"Id", -style:"Style", -classes:"Classes", -target_name:"Target name", -langdir:"Language direction", -target_langcode:"Target language", -langcode:"Language code", -encoding:"Target character encoding", -mime:"Target MIME type", -rel:"Relationship page to target", -rev:"Relationship target to page", -tabindex:"Tabindex", -accesskey:"Accesskey", -ltr:"Left to right", -rtl:"Right to left", -link_list:"Link list" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlink/link.htm b/plugins/TinyMCE/js/plugins/advlink/link.htm deleted file mode 100644 index 8ab7c2a95c..0000000000 --- a/plugins/TinyMCE/js/plugins/advlink/link.htm +++ /dev/null @@ -1,338 +0,0 @@ - - - - {#advlink_dlg.title} - - - - - - - - - -
    - - - - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js b/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js deleted file mode 100644 index 8895112b5f..0000000000 --- a/plugins/TinyMCE/js/plugins/advlist/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square");if(tinymce.isIE&&/MSIE [2-7]/.test(navigator.userAgent)){d.isIE7=true}},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("data-mce-style")}}i.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(k){if(f.isIE7&&k.styles.listStyleType=="lower-greek"){return}k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js deleted file mode 100644 index 13ef02ddd5..0000000000 --- a/plugins/TinyMCE/js/plugins/advlist/editor_plugin_src.js +++ /dev/null @@ -1,161 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each; - - tinymce.create('tinymce.plugins.AdvListPlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - function buildFormats(str) { - var formats = []; - - each(str.split(/,/), function(type) { - formats.push({ - title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')), - styles : { - listStyleType : type == 'default' ? '' : type - } - }); - }); - - return formats; - }; - - // Setup number formats from config or default - t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"); - t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square"); - - if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent)) - t.isIE7 = true; - }, - - createControl: function(name, cm) { - var t = this, btn, format; - - if (name == 'numlist' || name == 'bullist') { - // Default to first item if it's a default item - if (t[name][0].title == 'advlist.def') - format = t[name][0]; - - function hasFormat(node, format) { - var state = true; - - each(format.styles, function(value, name) { - // Format doesn't match - if (t.editor.dom.getStyle(node, name) != value) { - state = false; - return false; - } - }); - - return state; - }; - - function applyListFormat() { - var list, ed = t.editor, dom = ed.dom, sel = ed.selection; - - // Check for existing list element - list = dom.getParent(sel.getNode(), 'ol,ul'); - - // Switch/add list type if needed - if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format)) - ed.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList'); - - // Append styles to new list element - if (format) { - list = dom.getParent(sel.getNode(), 'ol,ul'); - if (list) { - dom.setStyles(list, format.styles); - list.removeAttribute('data-mce-style'); - } - } - ed.focus(); - }; - - btn = cm.createSplitButton(name, { - title : 'advanced.' + name + '_desc', - 'class' : 'mce_' + name, - onclick : function() { - applyListFormat(); - } - }); - - btn.onRenderMenu.add(function(btn, menu) { - menu.onShowMenu.add(function() { - var dom = t.editor.dom, list = dom.getParent(t.editor.selection.getNode(), 'ol,ul'), fmtList; - - if (list || format) { - fmtList = t[name]; - - // Unselect existing items - each(menu.items, function(item) { - var state = true; - - item.setSelected(0); - - if (list && !item.isDisabled()) { - each(fmtList, function(fmt) { - if (fmt.id == item.id) { - if (!hasFormat(list, fmt)) { - state = false; - return false; - } - } - }); - - if (state) - item.setSelected(1); - } - }); - - // Select the current format - if (!list) - menu.items[format.id].setSelected(1); - } - }); - - menu.add({id : t.editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1); - - each(t[name], function(item) { - // IE<8 doesn't support lower-greek, skip it - if (t.isIE7 && item.styles.listStyleType == 'lower-greek') - return; - - item.id = t.editor.dom.uniqueId(); - - menu.add({id : item.id, title : item.title, onclick : function() { - format = item; - applyListFormat(); - }}); - }); - }); - - return btn; - } - }, - - getInfo : function() { - return { - longname : 'Advanced lists', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autolink/editor_plugin.js b/plugins/TinyMCE/js/plugins/autolink/editor_plugin.js deleted file mode 100644 index c0f683a856..0000000000 --- a/plugins/TinyMCE/js/plugins/autolink/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;if(tinyMCE.isIE){return}a.onKeyDown.add(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}});a.onKeyPress.add(function(d,f){if(f.which==41){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng().cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("mceInsertLink",false,h[1]+h[2]);i.selection.moveToBookmark(k);if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autolink/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/autolink/editor_plugin_src.js deleted file mode 100644 index ddfe0494a9..0000000000 --- a/plugins/TinyMCE/js/plugins/autolink/editor_plugin_src.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2011, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.AutolinkPlugin', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - - init : function(ed, url) { - var t = this; - - // Internet Explorer has built-in automatic linking - if (tinyMCE.isIE) - return; - - // Add a key down handler - ed.onKeyDown.add(function(ed, e) { - if (e.keyCode == 13) - return t.handleEnter(ed); - }); - - ed.onKeyPress.add(function(ed, e) { - if (e.which == 41) - return t.handleEclipse(ed); - }); - - // Add a key up handler - ed.onKeyUp.add(function(ed, e) { - if (e.keyCode == 32) - return t.handleSpacebar(ed); - }); - }, - - handleEclipse : function(ed) { - this.parseCurrentLine(ed, -1, '(', true); - }, - - handleSpacebar : function(ed) { - this.parseCurrentLine(ed, 0, '', true); - }, - - handleEnter : function(ed) { - this.parseCurrentLine(ed, -1, '', false); - }, - - parseCurrentLine : function(ed, end_offset, delimiter, goback) { - var r, end, start, endContainer, bookmark, text, matches, prev, len; - - // We need at least five characters to form a URL, - // hence, at minimum, five characters from the beginning of the line. - r = ed.selection.getRng().cloneRange(); - if (r.startOffset < 5) { - // During testing, the caret is placed inbetween two text nodes. - // The previous text node contains the URL. - prev = r.endContainer.previousSibling; - if (prev == null) { - if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null) - return; - - prev = r.endContainer.firstChild.nextSibling; - } - len = prev.length; - r.setStart(prev, len); - r.setEnd(prev, len); - - if (r.endOffset < 5) - return; - - end = r.endOffset; - endContainer = prev; - } else { - endContainer = r.endContainer; - - // Get a text node - if (endContainer.nodeType != 3 && endContainer.firstChild) { - while (endContainer.nodeType != 3 && endContainer.firstChild) - endContainer = endContainer.firstChild; - - r.setStart(endContainer, 0); - r.setEnd(endContainer, endContainer.nodeValue.length); - } - - if (r.endOffset == 1) - end = 2; - else - end = r.endOffset - 1 - end_offset; - } - - start = end; - - do - { - // Move the selection one character backwards. - r.setStart(endContainer, end - 2); - r.setEnd(endContainer, end - 1); - end -= 1; - - // Loop until one of the following is found: a blank space,  , delimeter, (end-2) >= 0 - } while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter); - - if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) { - r.setStart(endContainer, end); - r.setEnd(endContainer, start); - end += 1; - } else if (r.startOffset == 0) { - r.setStart(endContainer, 0); - r.setEnd(endContainer, start); - } - else { - r.setStart(endContainer, end); - r.setEnd(endContainer, start); - } - - text = r.toString(); - matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i); - - if (matches) { - if (matches[1] == 'www.') { - matches[1] = 'http://www.'; - } - - bookmark = ed.selection.getBookmark(); - - ed.selection.setRng(r); - tinyMCE.execCommand('mceInsertLink',false, matches[1] + matches[2]); - ed.selection.moveToBookmark(bookmark); - - // TODO: Determine if this is still needed. - if (tinyMCE.isWebKit) { - // move the caret to its original position - ed.selection.collapse(false); - var max = Math.min(endContainer.length, start + 1); - r.setStart(endContainer, max); - r.setEnd(endContainer, max); - ed.selection.setRng(r); - } - } - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Autolink', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin); -})(); diff --git a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js deleted file mode 100644 index 6c4ff0d5df..0000000000 --- a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this,e=0;if(a.getParam("fullscreen_is_enabled")){return}function b(){var i=a.getDoc(),f=i.body,k=i.documentElement,h=tinymce.DOM,j=d.autoresize_min_height,g;g=tinymce.isIE?f.scrollHeight:i.body.offsetHeight;if(g>d.autoresize_min_height){j=g}if(d.autoresize_max_height&&g>d.autoresize_max_height){j=d.autoresize_max_height;a.getBody().style.overflowY="auto"}else{a.getBody().style.overflowY="hidden"}if(j!==e){h.setStyle(h.get(a.id+"_ifr"),"height",j+"px");e=j}if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight));d.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0));a.onInit.add(function(f){f.dom.setStyle(f.getBody(),"paddingBottom",f.getParam("autoresize_bottom_margin",50)+"px")});a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(g,f){g.setProgressState(true);d.throbbing=true;g.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(g,f){b();setTimeout(function(){b();g.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js deleted file mode 100644 index 7d113419d9..0000000000 --- a/plugins/TinyMCE/js/plugins/autoresize/editor_plugin_src.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - /** - * Auto Resize - * - * This plugin automatically resizes the content area to fit its content height. - * It will retain a minimum height, which is the height of the content area when - * it's initialized. - */ - tinymce.create('tinymce.plugins.AutoResizePlugin', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed, url) { - var t = this, oldSize = 0; - - if (ed.getParam('fullscreen_is_enabled')) - return; - - /** - * This method gets executed each time the editor needs to resize. - */ - function resize() { - var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; - - // Get height differently depending on the browser used - myHeight = tinymce.isIE ? b.scrollHeight : d.body.offsetHeight; - - // Don't make it smaller than the minimum height - if (myHeight > t.autoresize_min_height) - resizeHeight = myHeight; - - // If a maximum height has been defined don't exceed this height - if (t.autoresize_max_height && myHeight > t.autoresize_max_height) { - resizeHeight = t.autoresize_max_height; - ed.getBody().style.overflowY = "auto"; - } else - ed.getBody().style.overflowY = "hidden"; - - // Resize content element - if (resizeHeight !== oldSize) { - DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); - oldSize = resizeHeight; - } - - // if we're throbbing, we'll re-throb to match the new size - if (t.throbbing) { - ed.setProgressState(false); - ed.setProgressState(true); - } - }; - - t.editor = ed; - - // Define minimum height - t.autoresize_min_height = parseInt( ed.getParam('autoresize_min_height', ed.getElement().offsetHeight) ); - - // Define maximum height - t.autoresize_max_height = parseInt( ed.getParam('autoresize_max_height', 0) ); - - // Add padding at the bottom for better UX - ed.onInit.add(function(ed){ - ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px'); - }); - - // Add appropriate listeners for resizing content area - ed.onChange.add(resize); - ed.onSetContent.add(resize); - ed.onPaste.add(resize); - ed.onKeyUp.add(resize); - ed.onPostRender.add(resize); - - if (ed.getParam('autoresize_on_init', true)) { - // Things to do when the editor is ready - ed.onInit.add(function(ed, l) { - // Show throbber until content area is resized properly - ed.setProgressState(true); - t.throbbing = true; - - // Hide scrollbars - ed.getBody().style.overflowY = "hidden"; - }); - - ed.onLoadContent.add(function(ed, l) { - resize(); - - // Because the content area resizes when its content CSS loads, - // and we can't easily add a listener to its onload event, - // we'll just trigger a resize after a short loading period - setTimeout(function() { - resize(); - - // Disable throbber - ed.setProgressState(false); - t.throbbing = false; - }, 1250); - }); - } - - // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); - ed.addCommand('mceAutoResize', resize); - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Auto Resize', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); -})(); diff --git a/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js b/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js deleted file mode 100644 index 7f49107e65..0000000000 --- a/plugins/TinyMCE/js/plugins/autosave/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s| |<\/?p[^>]*>|]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,i=h.storage;if(i){content=i.getItem(h.key);if(content){h.editor.setContent(content);h.onRestoreDraft.dispatch(h,{content:content})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()]*>|]*>/gi, "").length > 0) { - // Show confirm dialog if the editor isn't empty - ed.windowManager.confirm( - PLUGIN_NAME + ".warning_message", - function(ok) { - if (ok) - self.restoreDraft(); - } - ); - } else - self.restoreDraft(); - } - }); - - // Enable/disable restoredraft button depending on if there is a draft stored or not - ed.onNodeChange.add(function() { - var controlManager = ed.controlManager; - - if (controlManager.get(RESTORE_DRAFT)) - controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft()); - }); - - ed.onInit.add(function() { - // Check if the user added the restore button, then setup auto storage logic - if (ed.controlManager.get(RESTORE_DRAFT)) { - // Setup storage engine - self.setupStorage(ed); - - // Auto save contents each interval time - setInterval(function() { - self.storeDraft(); - ed.nodeChanged(); - }, settings.autosave_interval); - } - }); - - /** - * This event gets fired when a draft is stored to local storage. - * - * @event onStoreDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onStoreDraft = new Dispatcher(self); - - /** - * This event gets fired when a draft is restored from local storage. - * - * @event onStoreDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onRestoreDraft = new Dispatcher(self); - - /** - * This event gets fired when a draft removed/expired. - * - * @event onRemoveDraft - * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. - * @param {Object} draft Draft object containing the HTML contents of the editor. - */ - self.onRemoveDraft = new Dispatcher(self); - - // Add ask before unload dialog only add one unload handler - if (!unloadHandlerAdded) { - window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler; - unloadHandlerAdded = TRUE; - } - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @method getInfo - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Auto save', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - /** - * Returns an expiration date UTC string. - * - * @method getExpDate - * @return {String} Expiration date UTC string. - */ - getExpDate : function() { - return new Date( - new Date().getTime() + this.editor.settings.autosave_retention - ).toUTCString(); - }, - - /** - * This method will setup the storage engine. If the browser has support for it. - * - * @method setupStorage - */ - setupStorage : function(ed) { - var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK"; - - self.key = PLUGIN_NAME + ed.id; - - // Loop though each storage engine type until we find one that works - tinymce.each([ - function() { - // Try HTML5 Local Storage - if (localStorage) { - localStorage.setItem(testKey, testVal); - - if (localStorage.getItem(testKey) === testVal) { - localStorage.removeItem(testKey); - - return localStorage; - } - } - }, - - function() { - // Try HTML5 Session Storage - if (sessionStorage) { - sessionStorage.setItem(testKey, testVal); - - if (sessionStorage.getItem(testKey) === testVal) { - sessionStorage.removeItem(testKey); - - return sessionStorage; - } - } - }, - - function() { - // Try IE userData - if (tinymce.isIE) { - ed.getElement().style.behavior = "url('#default#userData')"; - - // Fake localStorage on old IE - return { - autoExpires : TRUE, - - setItem : function(key, value) { - var userDataElement = ed.getElement(); - - userDataElement.setAttribute(key, value); - userDataElement.expires = self.getExpDate(); - - try { - userDataElement.save("TinyMCE"); - } catch (e) { - // Ignore, saving might fail if "Userdata Persistence" is disabled in IE - } - }, - - getItem : function(key) { - var userDataElement = ed.getElement(); - - try { - userDataElement.load("TinyMCE"); - return userDataElement.getAttribute(key); - } catch (e) { - // Ignore, loading might fail if "Userdata Persistence" is disabled in IE - return null; - } - }, - - removeItem : function(key) { - ed.getElement().removeAttribute(key); - } - }; - } - }, - ], function(setup) { - // Try executing each function to find a suitable storage engine - try { - self.storage = setup(); - - if (self.storage) - return false; - } catch (e) { - // Ignore - } - }); - }, - - /** - * This method will store the current contents in the the storage engine. - * - * @method storeDraft - */ - storeDraft : function() { - var self = this, storage = self.storage, editor = self.editor, expires, content; - - // Is the contents dirty - if (storage) { - // If there is no existing key and the contents hasn't been changed since - // it's original value then there is no point in saving a draft - if (!storage.getItem(self.key) && !editor.isDirty()) - return; - - // Store contents if the contents if longer than the minlength of characters - content = editor.getContent({draft: true}); - if (content.length > editor.settings.autosave_minlength) { - expires = self.getExpDate(); - - // Store expiration date if needed IE userData has auto expire built in - if (!self.storage.autoExpires) - self.storage.setItem(self.key + "_expires", expires); - - self.storage.setItem(self.key, content); - self.onStoreDraft.dispatch(self, { - expires : expires, - content : content - }); - } - } - }, - - /** - * This method will restore the contents from the storage engine back to the editor. - * - * @method restoreDraft - */ - restoreDraft : function() { - var self = this, storage = self.storage; - - if (storage) { - content = storage.getItem(self.key); - - if (content) { - self.editor.setContent(content); - self.onRestoreDraft.dispatch(self, { - content : content - }); - } - } - }, - - /** - * This method will return true/false if there is a local storage draft available. - * - * @method hasDraft - * @return {boolean} true/false state if there is a local draft. - */ - hasDraft : function() { - var self = this, storage = self.storage, expDate, exists; - - if (storage) { - // Does the item exist at all - exists = !!storage.getItem(self.key); - if (exists) { - // Storage needs autoexpire - if (!self.storage.autoExpires) { - expDate = new Date(storage.getItem(self.key + "_expires")); - - // Contents hasn't expired - if (new Date().getTime() < expDate.getTime()) - return TRUE; - - // Remove it if it has - self.removeDraft(); - } else - return TRUE; - } - } - - return false; - }, - - /** - * Removes the currently stored draft. - * - * @method removeDraft - */ - removeDraft : function() { - var self = this, storage = self.storage, key = self.key, content; - - if (storage) { - // Get current contents and remove the existing draft - content = storage.getItem(key); - storage.removeItem(key); - storage.removeItem(key + "_expires"); - - // Dispatch remove event if we had any contents - if (content) { - self.onRemoveDraft.dispatch(self, { - content : content - }); - } - } - }, - - "static" : { - // Internal unload handler will be called before the page is unloaded - _beforeUnloadHandler : function(e) { - var msg; - - tinymce.each(tinyMCE.editors, function(ed) { - // Store a draft for each editor instance - if (ed.plugins.autosave) - ed.plugins.autosave.storeDraft(); - - // Never ask in fullscreen mode - if (ed.getParam("fullscreen_is_enabled")) - return; - - // Setup a return message if the editor is dirty - if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload")) - msg = ed.getLang("autosave.unload_msg"); - }); - - return msg; - } - } - }); - - tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave); -})(tinymce); diff --git a/plugins/TinyMCE/js/plugins/autosave/langs/en.js b/plugins/TinyMCE/js/plugins/autosave/langs/en.js deleted file mode 100644 index fce6bd3e1f..0000000000 --- a/plugins/TinyMCE/js/plugins/autosave/langs/en.js +++ /dev/null @@ -1,4 +0,0 @@ -tinyMCE.addI18n('en.autosave',{ -restore_content: "Restore auto-saved content", -warning_message: "If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js deleted file mode 100644 index 8f8821fd64..0000000000 --- a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/(.*?)<\/font>/gi,"$1");b(//gi,"[img]$1[/img]");b(/(.*?)<\/span>/gi,"[code]$1[/code]");b(/(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/(.*?)<\/span>/gi,"[u]$1[/u]");b(//gi,"[u]");b(/]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/
    /gi,"\n");b(//gi,"\n");b(/
    /gi,"\n");b(/

    /gi,"");b(/<\/p>/gi,"\n");b(/ |\u00a0/gi," ");b(/"/gi,'"');b(/</gi,"<");b(/>/gi,">");b(/&/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"
    ");b(/\[b\]/gi,"");b(/\[\/b\]/gi,"");b(/\[i\]/gi,"");b(/\[\/i\]/gi,"");b(/\[u\]/gi,"");b(/\[\/u\]/gi,"");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2');b(/\[url\](.*?)\[\/url\]/gi,'$1');b(/\[img\](.*?)\[\/img\]/gi,'');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2');b(/\[code\](.*?)\[\/code\]/gi,'$1 ');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 ');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js deleted file mode 100644 index 4e7eb3377f..0000000000 --- a/plugins/TinyMCE/js/plugins/bbcode/editor_plugin_src.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.BBCodePlugin', { - init : function(ed, url) { - var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase(); - - ed.onBeforeSetContent.add(function(ed, o) { - o.content = t['_' + dialect + '_bbcode2html'](o.content); - }); - - ed.onPostProcess.add(function(ed, o) { - if (o.set) - o.content = t['_' + dialect + '_bbcode2html'](o.content); - - if (o.get) - o.content = t['_' + dialect + '_html2bbcode'](o.content); - }); - }, - - getInfo : function() { - return { - longname : 'BBCode Plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - // HTML -> BBCode in PunBB dialect - _punbb_html2bbcode : function(s) { - s = tinymce.trim(s); - - function rep(re, str) { - s = s.replace(re, str); - }; - - // example: to [b] - rep(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"); - rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); - rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); - rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); - rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); - rep(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"); - rep(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"); - rep(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"); - rep(/(.*?)<\/font>/gi,"$1"); - rep(//gi,"[img]$1[/img]"); - rep(/(.*?)<\/span>/gi,"[code]$1[/code]"); - rep(/(.*?)<\/span>/gi,"[quote]$1[/quote]"); - rep(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"); - rep(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"); - rep(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"); - rep(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"); - rep(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"); - rep(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"); - rep(/<\/(strong|b)>/gi,"[/b]"); - rep(/<(strong|b)>/gi,"[b]"); - rep(/<\/(em|i)>/gi,"[/i]"); - rep(/<(em|i)>/gi,"[i]"); - rep(/<\/u>/gi,"[/u]"); - rep(/(.*?)<\/span>/gi,"[u]$1[/u]"); - rep(//gi,"[u]"); - rep(/]*>/gi,"[quote]"); - rep(/<\/blockquote>/gi,"[/quote]"); - rep(/
    /gi,"\n"); - rep(//gi,"\n"); - rep(/
    /gi,"\n"); - rep(/

    /gi,""); - rep(/<\/p>/gi,"\n"); - rep(/ |\u00a0/gi," "); - rep(/"/gi,"\""); - rep(/</gi,"<"); - rep(/>/gi,">"); - rep(/&/gi,"&"); - - return s; - }, - - // BBCode -> HTML from PunBB dialect - _punbb_bbcode2html : function(s) { - s = tinymce.trim(s); - - function rep(re, str) { - s = s.replace(re, str); - }; - - // example: [b] to - rep(/\n/gi,"
    "); - rep(/\[b\]/gi,""); - rep(/\[\/b\]/gi,""); - rep(/\[i\]/gi,""); - rep(/\[\/i\]/gi,""); - rep(/\[u\]/gi,""); - rep(/\[\/u\]/gi,""); - rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2"); - rep(/\[url\](.*?)\[\/url\]/gi,"$1"); - rep(/\[img\](.*?)\[\/img\]/gi,""); - rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"$2"); - rep(/\[code\](.*?)\[\/code\]/gi,"$1 "); - rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"$1 "); - - return s; - } - }); - - // Register plugin - tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js deleted file mode 100644 index af7ae54453..0000000000 --- a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,f,d,i;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if((i!==0?i:k.ctrlKey)&&!d){return}a.cancel(k);if(k.target.nodeName=="IMG"){j.selection.select(k.target)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageY);a.add(j.getDoc(),"click",function(l){g(j,l)});j.nodeChanged()});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=0;if(k&&k.button==2){i=k.ctrlKey;return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js deleted file mode 100644 index 956fbea998..0000000000 --- a/plugins/TinyMCE/js/plugins/contextmenu/editor_plugin_src.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; - - /** - * This plugin a context menu to TinyMCE editor instances. - * - * @class tinymce.plugins.ContextMenu - */ - tinymce.create('tinymce.plugins.ContextMenu', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @method init - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed) { - var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey; - - t.editor = ed; - - contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native; - - /** - * This event gets fired when the context menu is shown. - * - * @event onContextMenu - * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event. - * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed. - */ - t.onContextMenu = new tinymce.util.Dispatcher(this); - - showMenu = ed.onContextMenu.add(function(ed, e) { - // Block TinyMCE menu on ctrlKey and work around Safari issue - if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative) - return; - - Event.cancel(e); - - // Select the image if it's clicked. WebKit would other wise expand the selection - if (e.target.nodeName == 'IMG') - ed.selection.select(e.target); - - t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY); - Event.add(ed.getDoc(), 'click', function(e) { - hide(ed, e); - }); - - ed.nodeChanged(); - }); - - ed.onRemove.add(function() { - if (t._menu) - t._menu.removeAll(); - }); - - function hide(ed, e) { - realCtrlKey = 0; - - // Since the contextmenu event moves - // the selection we need to store it away - if (e && e.button == 2) { - realCtrlKey = e.ctrlKey; - return; - } - - if (t._menu) { - t._menu.removeAll(); - t._menu.destroy(); - Event.remove(ed.getDoc(), 'click', hide); - } - }; - - ed.onMouseDown.add(hide); - ed.onKeyDown.add(hide); - ed.onKeyDown.add(function(ed, e) { - if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) { - Event.cancel(e); - showMenu(ed, e); - } - }); - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @method getInfo - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Contextmenu', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _getMenu : function(ed) { - var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p; - - if (m) { - m.removeAll(); - m.destroy(); - } - - p = DOM.getPos(ed.getContentAreaContainer()); - - m = ed.controlManager.createDropMenu('contextmenu', { - offset_x : p.x + ed.getParam('contextmenu_offset_x', 0), - offset_y : p.y + ed.getParam('contextmenu_offset_y', 0), - constrain : 1, - keyboard_focus: true - }); - - t._menu = m; - - m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col); - m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col); - m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'}); - - if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) { - m.addSeparator(); - m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); - m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); - } - - m.addSeparator(); - m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); - - m.addSeparator(); - am = m.addMenu({title : 'contextmenu.align'}); - am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'}); - am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'}); - am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'}); - am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'}); - - t.onContextMenu.dispatch(t, m, el, col); - - return m; - } - }); - - // Register plugin - tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu); -})(); diff --git a/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js b/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js deleted file mode 100644 index bce8e73995..0000000000 --- a/plugins/TinyMCE/js/plugins/directionality/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},getInfo:function(){return{longname:"Directionality",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js deleted file mode 100644 index 4444959bf3..0000000000 --- a/plugins/TinyMCE/js/plugins/directionality/editor_plugin_src.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Directionality', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - ed.addCommand('mceDirectionLTR', function() { - var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); - - if (e) { - if (ed.dom.getAttrib(e, "dir") != "ltr") - ed.dom.setAttrib(e, "dir", "ltr"); - else - ed.dom.setAttrib(e, "dir", ""); - } - - ed.nodeChanged(); - }); - - ed.addCommand('mceDirectionRTL', function() { - var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); - - if (e) { - if (ed.dom.getAttrib(e, "dir") != "rtl") - ed.dom.setAttrib(e, "dir", "rtl"); - else - ed.dom.setAttrib(e, "dir", ""); - } - - ed.nodeChanged(); - }); - - ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'}); - ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'}); - - ed.onNodeChange.add(t._nodeChange, t); - }, - - getInfo : function() { - return { - longname : 'Directionality', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var dom = ed.dom, dir; - - n = dom.getParent(n, dom.isBlock); - if (!n) { - cm.setDisabled('ltr', 1); - cm.setDisabled('rtl', 1); - return; - } - - dir = dom.getAttrib(n, 'dir'); - cm.setActive('ltr', dir == "ltr"); - cm.setDisabled('ltr', 0); - cm.setActive('rtl', dir == "rtl"); - cm.setDisabled('rtl', 0); - } - }); - - // Register plugin - tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js b/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js deleted file mode 100644 index dbdd8ffb58..0000000000 --- a/plugins/TinyMCE/js/plugins/emotions/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js deleted file mode 100644 index 71d5416972..0000000000 --- a/plugins/TinyMCE/js/plugins/emotions/editor_plugin_src.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - tinymce.create('tinymce.plugins.EmotionsPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceEmotion', function() { - ed.windowManager.open({ - file : url + '/emotions.htm', - width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)), - height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'}); - }, - - getInfo : function() { - return { - longname : 'Emotions', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin); -})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/emotions/emotions.htm b/plugins/TinyMCE/js/plugins/emotions/emotions.htm deleted file mode 100644 index 2c91002e4e..0000000000 --- a/plugins/TinyMCE/js/plugins/emotions/emotions.htm +++ /dev/null @@ -1,41 +0,0 @@ - - - - {#emotions_dlg.title} - - - - - -

    -
    {#emotions_dlg.title}:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {#emotions_dlg.cool}{#emotions_dlg.cry}{#emotions_dlg.embarassed}{#emotions_dlg.foot_in_mouth}
    {#emotions_dlg.frown}{#emotions_dlg.innocent}{#emotions_dlg.kiss}{#emotions_dlg.laughing}
    {#emotions_dlg.money_mouth}{#emotions_dlg.sealed}{#emotions_dlg.smile}{#emotions_dlg.surprised}
    {#emotions_dlg.tongue-out}{#emotions_dlg.undecided}{#emotions_dlg.wink}{#emotions_dlg.yell}
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-cool.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cool.gif deleted file mode 100644 index ba90cc36fb0415d0273d1cd206bff63fd9c91fde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFIwNk%w1VG;lm0Mr!#3ke00dJfFY%i+lrhK7V(RutUQJhPY;?(XfrsZKgL z7WLQ^zPO&zzav{)SL^9nBOw~z(=orMEH5uC-P_gr`uhCnASMa|$-iRw?m_(dUwU8) zq>Kx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-cry.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-cry.gif deleted file mode 100644 index 74d897a4f6d22e814e2b054e98b8a75fb464b4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<~6+>@EpxfA0YrcPNsSu diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-embarassed.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-embarassed.gif deleted file mode 100644 index 963a96b8a7593b1d8bcbab073abe5ee4e539dbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$BSR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kdc3IhA?Hvj+tA^8La0018VEC2ui01^Na06+!P;3tYuX_ljS7!u|-O)I}TzP1q%xT4HOFwMJaO;2ml)!00$)141pU08x3594IX?4 o5YuAA8yXz~76K1c;3^jg77WP185Rf^u}23N0sR5^q(T4yJ1sVN5dZ)H diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-frown.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-frown.gif deleted file mode 100644 index 716f55e161bfebb1c3d34f0b0f40c177fc82c30b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvH;Nk%w1VG;lm0MroxK_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01yyk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-innocent.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-innocent.gif deleted file mode 100644 index 334d49e0e60f2997c9ba24071764f95d9e08a5cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yos!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DIT=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltkx9~2uL3&z-yb0WJDRY082|tP diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-laughing.gif deleted file mode 100644 index 82c5b182e61d32bd394acae551eff180f1eebd26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmV-d0jT~*Nk%w1VG;lm0Q4UK!lp8=s;1-69HWK?p_PpF=Pd8~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(Ec zG>66zv=rqr;2j)}gKqE$ekcSD?}0=WLB?AWp85)qALd+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyBKJqy*wF8}}lA^8La0018VEC2ui01^Na06+!6;3tYxX_lj?7+U61R3gAaEg8x< zT>%mSfCwURnWQF&g=Q0ZxH1ulW`QtH0>O!5%iT_X0VBy_@EkOngU8?ye~=H!t21{= z9@Uj3a_UbE88~kh5Eq7rh!7QSBn1c?0|Off1&k^`5*QE<4-gmSR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UUC3IeK%0ssI2A^8La0018VEC2ui01^Na06+!R;3tYuX_ljSEE482&%+G^XK%|f zLKbCc4u{4-u|QG~LqamSTo?@JM3OKZAr!|Z2IzP@fY`=CIg$vA3qm46TowfLCt29I z6pDKuvnf~)83+sm9yW#?9s>^(89F=~2?!W44-6Ox2^vNza}fp^9v&G65pp936%Gg+ z6HpTy2o4oGoh+>l3Q)KVQwybl2oo*<4a3D469|nfEii|MH4`}p1_cZp0ssj%2>=2d q41Na?)CpS;4gvxWVpZcR76uLludD?Q1{SnP2NnVU0rZ&)0RTIit8@_n diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-surprised.gif deleted file mode 100644 index 0cc9bb71cca4cdeafbb248ce7e07c3708c1cbd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Q4UK`{WwN#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*)c32kA}f=futY?#YE7kxGD|7L}4&OEDw$hkm+~<00QS>F_H?J#bz?uEHnl42f5(9 z5O)`6Q9V2o5;YVLUK)Y`7!Nr+4GMq?85s%^2?`BGDRU798Vn2?1`%>22R{iO0u>bk z9tlA?nk*O<3zHJH6&Mp5qALj)E(mxM!Y&vII4dm@1Ov{`f*8pL3xPEVUI>D>1_uxa kNm?`6VH{N6Di;P13m6<67z+;u7qCYM7XkVK^`jvGJD~P?KL7v# diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-tongue-out.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-tongue-out.gif deleted file mode 100644 index 2075dc16058f1f17912167675ce5cfb9986fc71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cvj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nbmjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-undecided.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-undecided.gif deleted file mode 100644 index bef7e257303f8243c89787e7a7f9955dd1f112e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 diff --git a/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif b/plugins/TinyMCE/js/plugins/emotions/img/smiley-wink.gif deleted file mode 100644 index 0631c7616ec8624ddeee02b633326f697ee72f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0ipg!Nk%w1VG;lm0Q4UK(ZVUl#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfF$4Fdh~IsgCwA^8La0018VEC2ui01^Na06+!X;3tYwX_ljiFp=e23$zWxW@`*G zN?2ty6iUNT!AMdPLn89IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp - - - {#example_dlg.title} - - - - - -
    -

    Here is a example dialog.

    -

    Selected text:

    -

    Custom arg:

    - -
    - - -
    -
    - - - diff --git a/plugins/TinyMCE/js/plugins/example/editor_plugin.js b/plugins/TinyMCE/js/plugins/example/editor_plugin.js deleted file mode 100644 index ec1f81ea40..0000000000 --- a/plugins/TinyMCE/js/plugins/example/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js deleted file mode 100644 index 9a0e7da15d..0000000000 --- a/plugins/TinyMCE/js/plugins/example/editor_plugin_src.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - // Load plugin specific language pack - tinymce.PluginManager.requireLangPack('example'); - - tinymce.create('tinymce.plugins.ExamplePlugin', { - /** - * Initializes the plugin, this will be executed after the plugin has been created. - * This call is done before the editor instance has finished it's initialization so use the onInit event - * of the editor instance to intercept that event. - * - * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. - * @param {string} url Absolute URL to where the plugin is located. - */ - init : function(ed, url) { - // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); - ed.addCommand('mceExample', function() { - ed.windowManager.open({ - file : url + '/dialog.htm', - width : 320 + parseInt(ed.getLang('example.delta_width', 0)), - height : 120 + parseInt(ed.getLang('example.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, // Plugin absolute URL - some_custom_arg : 'custom arg' // Custom argument - }); - }); - - // Register example button - ed.addButton('example', { - title : 'example.desc', - cmd : 'mceExample', - image : url + '/img/example.gif' - }); - - // Add a node change handler, selects the button in the UI when a image is selected - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('example', n.nodeName == 'IMG'); - }); - }, - - /** - * Creates control instances based in the incomming name. This method is normally not - * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons - * but you sometimes need to create more complex controls like listboxes, split buttons etc then this - * method can be used to create those. - * - * @param {String} n Name of the control to create. - * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control. - * @return {tinymce.ui.Control} New control instance or null if no control was created. - */ - createControl : function(n, cm) { - return null; - }, - - /** - * Returns information about the plugin as a name/value array. - * The current keys are longname, author, authorurl, infourl and version. - * - * @return {Object} Name/value array containing information about the plugin. - */ - getInfo : function() { - return { - longname : 'Example plugin', - author : 'Some author', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example', - version : "1.0" - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/example/img/example.gif b/plugins/TinyMCE/js/plugins/example/img/example.gif deleted file mode 100644 index 1ab5da4461113d2af579898528246fdbe52ecd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*pGzw+SQ`#f{}FJ-?!v#V)e mtsGNfpJeCKSAiOz**>0`XR2{OVa>-G_df0vaY"}i=f.getAll("title")[0];if(i&&i.firstChild){h.metatitle=i.firstChild.value}b(f.getAll("meta"),function(m){var k=m.attr("name"),j=m.attr("http-equiv"),l;if(k){h["meta"+k.toLowerCase()]=m.attr("content")}else{if(j=="Content-Type"){l=/charset\s*=\s*(.*)\s*/gi.exec(m.attr("content"));if(l){h.docencoding=l[1]}}}});i=f.getAll("html")[0];if(i){h.langcode=d(i,"lang")||d(i,"xml:lang")}i=f.getAll("link")[0];if(i&&i.attr("rel")=="stylesheet"){h.stylesheet=i.attr("href")}i=f.getAll("body")[0];if(i){h.langdir=d(i,"dir");h.style=d(i,"style");h.visited_color=d(i,"vlink");h.link_color=d(i,"link");h.active_color=d(i,"alink")}return h},_dataToHtml:function(g){var f,d,h,j,k,e=this.editor.dom;function c(n,l,m){n.attr(l,m?m:undefined)}function i(l){if(d.firstChild){d.insert(l,d.firstChild)}else{d.append(l)}}f=this._parseHeader();d=f.getAll("head")[0];if(!d){j=f.getAll("html")[0];d=new a("head",1);if(j.firstChild){j.insert(d,j.firstChild,true)}else{j.append(d)}}j=f.firstChild;if(g.xml_pi){k='version="1.0"';if(g.docencoding){k+=' encoding="'+g.docencoding+'"'}if(j.type!=7){j=new a("xml",7);f.insert(j,f.firstChild,true)}j.value=k}else{if(j&&j.type==7){j.remove()}}j=f.getAll("#doctype")[0];if(g.doctype){if(!j){j=new a("#doctype",10);if(g.xml_pi){f.insert(j,f.firstChild)}else{i(j)}}j.value=g.doctype.substring(9,g.doctype.length-1)}else{if(j){j.remove()}}j=f.getAll("title")[0];if(g.metatitle){if(!j){j=new a("title",1);j.append(new a("#text",3)).value=g.metatitle;i(j)}}if(g.docencoding){j=null;b(f.getAll("meta"),function(l){if(l.attr("http-equiv")=="Content-Type"){j=l}});if(!j){j=new a("meta",1);j.attr("http-equiv","Content-Type");j.shortEnded=true;i(j)}j.attr("content","text/html; charset="+g.docencoding)}b("keywords,description,author,copyright,robots".split(","),function(m){var l=f.getAll("meta"),n,p,o=g["meta"+m];for(n=0;n"))},_parseHeader:function(){return new tinymce.html.DomParser({validate:false,root_name:"#document"}).parse(this.head)},_setContent:function(g,d){var m=this,i,c,h=d.content,f,l="",e=m.editor.dom,j;function k(n){return n.replace(/<\/?[A-Z]+/g,function(o){return o.toLowerCase()})}if(d.format=="raw"&&m.head){return}if(d.source_view&&g.getParam("fullpage_hide_in_source_view")){return}h=h.replace(/<(\/?)BODY/gi,"<$1body");i=h.indexOf("",i);m.head=k(h.substring(0,i+1));c=h.indexOf("\n"}f=m._parseHeader();b(f.getAll("style"),function(n){if(n.firstChild){l+=n.firstChild.value}});j=f.getAll("body")[0];if(j){e.setAttribs(m.editor.getBody(),{style:j.attr("style")||"",dir:j.attr("dir")||"",vLink:j.attr("vlink")||"",link:j.attr("link")||"",aLink:j.attr("alink")||""})}if(l){e.add(m.editor.getDoc().getElementsByTagName("head")[0],"style",{id:"fullpage_styles"},l)}else{e.remove("fullpage_styles")}},_getDefaultHeader:function(){var f="",c=this.editor,e,d="";if(c.getParam("fullpage_default_xml_pi")){f+='\n'}f+=c.getParam("fullpage_default_doctype",'');f+="\n\n\n";if(e=c.getParam("fullpage_default_title")){f+=""+e+"\n"}if(e=c.getParam("fullpage_default_encoding")){f+='\n'}if(e=c.getParam("fullpage_default_font_family")){d+="font-family: "+e+";"}if(e=c.getParam("fullpage_default_font_size")){d+="font-size: "+e+";"}if(e=c.getParam("fullpage_default_text_color")){d+="color: "+e+";"}f+="\n\n";return f},_getContent:function(d,e){var c=this;if(!e.source_view||!d.getParam("fullpage_hide_in_source_view")){e.content=tinymce.trim(c.head)+"\n"+tinymce.trim(e.content)+"\n"+tinymce.trim(c.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js deleted file mode 100644 index 5725b56152..0000000000 --- a/plugins/TinyMCE/js/plugins/fullpage/editor_plugin_src.js +++ /dev/null @@ -1,399 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each, Node = tinymce.html.Node; - - tinymce.create('tinymce.plugins.FullPagePlugin', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceFullPageProperties', function() { - ed.windowManager.open({ - file : url + '/fullpage.htm', - width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)), - height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - data : t._htmlToData() - }); - }); - - // Register buttons - ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'}); - - ed.onBeforeSetContent.add(t._setContent, t); - ed.onGetContent.add(t._getContent, t); - }, - - getInfo : function() { - return { - longname : 'Fullpage', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private plugin internal methods - - _htmlToData : function() { - var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor; - - function getAttr(elm, name) { - var value = elm.attr(name); - - return value || ''; - }; - - // Default some values - data.fontface = editor.getParam("fullpage_default_fontface", ""); - data.fontsize = editor.getParam("fullpage_default_fontsize", ""); - - // Parse XML PI - elm = headerFragment.firstChild; - if (elm.type == 7) { - data.xml_pi = true; - matches = /encoding="([^"]+)"/.exec(elm.value); - if (matches) - data.docencoding = matches[1]; - } - - // Parse doctype - elm = headerFragment.getAll('#doctype')[0]; - if (elm) - data.doctype = '"; - - // Parse title element - elm = headerFragment.getAll('title')[0]; - if (elm && elm.firstChild) { - data.metatitle = elm.firstChild.value; - } - - // Parse meta elements - each(headerFragment.getAll('meta'), function(meta) { - var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches; - - if (name) - data['meta' + name.toLowerCase()] = meta.attr('content'); - else if (httpEquiv == "Content-Type") { - matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); - - if (matches) - data.docencoding = matches[1]; - } - }); - - // Parse html attribs - elm = headerFragment.getAll('html')[0]; - if (elm) - data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); - - // Parse stylesheet - elm = headerFragment.getAll('link')[0]; - if (elm && elm.attr('rel') == 'stylesheet') - data.stylesheet = elm.attr('href'); - - // Parse body parts - elm = headerFragment.getAll('body')[0]; - if (elm) { - data.langdir = getAttr(elm, 'dir'); - data.style = getAttr(elm, 'style'); - data.visited_color = getAttr(elm, 'vlink'); - data.link_color = getAttr(elm, 'link'); - data.active_color = getAttr(elm, 'alink'); - } - - return data; - }, - - _dataToHtml : function(data) { - var headerFragment, headElement, html, elm, value, dom = this.editor.dom; - - function setAttr(elm, name, value) { - elm.attr(name, value ? value : undefined); - }; - - function addHeadNode(node) { - if (headElement.firstChild) - headElement.insert(node, headElement.firstChild); - else - headElement.append(node); - }; - - headerFragment = this._parseHeader(); - headElement = headerFragment.getAll('head')[0]; - if (!headElement) { - elm = headerFragment.getAll('html')[0]; - headElement = new Node('head', 1); - - if (elm.firstChild) - elm.insert(headElement, elm.firstChild, true); - else - elm.append(headElement); - } - - // Add/update/remove XML-PI - elm = headerFragment.firstChild; - if (data.xml_pi) { - value = 'version="1.0"'; - - if (data.docencoding) - value += ' encoding="' + data.docencoding + '"'; - - if (elm.type != 7) { - elm = new Node('xml', 7); - headerFragment.insert(elm, headerFragment.firstChild, true); - } - - elm.value = value; - } else if (elm && elm.type == 7) - elm.remove(); - - // Add/update/remove doctype - elm = headerFragment.getAll('#doctype')[0]; - if (data.doctype) { - if (!elm) { - elm = new Node('#doctype', 10); - - if (data.xml_pi) - headerFragment.insert(elm, headerFragment.firstChild); - else - addHeadNode(elm); - } - - elm.value = data.doctype.substring(9, data.doctype.length - 1); - } else if (elm) - elm.remove(); - - // Add/update/remove title - elm = headerFragment.getAll('title')[0]; - if (data.metatitle) { - if (!elm) { - elm = new Node('title', 1); - elm.append(new Node('#text', 3)).value = data.metatitle; - addHeadNode(elm); - } - } - - // Add meta encoding - if (data.docencoding) { - elm = null; - each(headerFragment.getAll('meta'), function(meta) { - if (meta.attr('http-equiv') == 'Content-Type') - elm = meta; - }); - - if (!elm) { - elm = new Node('meta', 1); - elm.attr('http-equiv', 'Content-Type'); - elm.shortEnded = true; - addHeadNode(elm); - } - - elm.attr('content', 'text/html; charset=' + data.docencoding); - } - - // Add/update/remove meta - each('keywords,description,author,copyright,robots'.split(','), function(name) { - var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name]; - - for (i = 0; i < nodes.length; i++) { - meta = nodes[i]; - - if (meta.attr('name') == name) { - if (value) - meta.attr('content', value); - else - meta.remove(); - - return; - } - } - - if (value) { - elm = new Node('meta', 1); - elm.attr('name', name); - elm.attr('content', value); - elm.shortEnded = true; - - addHeadNode(elm); - } - }); - - // Add/update/delete link - elm = headerFragment.getAll('link')[0]; - if (elm && elm.attr('rel') == 'stylesheet') { - if (data.stylesheet) - elm.attr('href', data.stylesheet); - else - elm.remove(); - } else if (data.stylesheet) { - elm = new Node('link', 1); - elm.attr({ - rel : 'stylesheet', - text : 'text/css', - href : data.stylesheet - }); - elm.shortEnded = true; - - addHeadNode(elm); - } - - // Update body attributes - elm = headerFragment.getAll('body')[0]; - if (elm) { - setAttr(elm, 'dir', data.langdir); - setAttr(elm, 'style', data.style); - setAttr(elm, 'vlink', data.visited_color); - setAttr(elm, 'link', data.link_color); - setAttr(elm, 'alink', data.active_color); - - // Update iframe body as well - dom.setAttribs(this.editor.getBody(), { - style : data.style, - dir : data.dir, - vLink : data.visited_color, - link : data.link_color, - aLink : data.active_color - }); - } - - // Set html attributes - elm = headerFragment.getAll('html')[0]; - if (elm) { - setAttr(elm, 'lang', data.langcode); - setAttr(elm, 'xml:lang', data.langcode); - } - - // Serialize header fragment and crop away body part - html = new tinymce.html.Serializer({ - validate: false, - indent: true, - apply_source_formatting : true, - indent_before: 'head,html,body,meta,title,script,link,style', - indent_after: 'head,html,body,meta,title,script,link,style' - }).serialize(headerFragment); - - this.head = html.substring(0, html.indexOf('')); - }, - - _parseHeader : function() { - // Parse the contents with a DOM parser - return new tinymce.html.DomParser({ - validate: false, - root_name: '#document' - }).parse(this.head); - }, - - _setContent : function(ed, o) { - var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm; - - function low(s) { - return s.replace(/<\/?[A-Z]+/g, function(a) { - return a.toLowerCase(); - }) - }; - - // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate - if (o.format == 'raw' && self.head) - return; - - if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) - return; - - // Parse out head, body and footer - content = content.replace(/<(\/?)BODY/gi, '<$1body'); - startPos = content.indexOf('', startPos); - self.head = low(content.substring(0, startPos + 1)); - - endPos = content.indexOf('\n'; - - header += editor.getParam('fullpage_default_doctype', ''); - header += '\n\n\n'; - - if (value = editor.getParam('fullpage_default_title')) - header += '' + value + '\n'; - - if (value = editor.getParam('fullpage_default_encoding')) - header += '\n'; - - if (value = editor.getParam('fullpage_default_font_family')) - styles += 'font-family: ' + value + ';'; - - if (value = editor.getParam('fullpage_default_font_size')) - styles += 'font-size: ' + value + ';'; - - if (value = editor.getParam('fullpage_default_text_color')) - styles += 'color: ' + value + ';'; - - header += '\n\n'; - - return header; - }, - - _getContent : function(ed, o) { - var self = this; - - if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) - o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot); - } - }); - - // Register plugin - tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin); -})(); diff --git a/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm b/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm deleted file mode 100644 index 14ab8652ea..0000000000 --- a/plugins/TinyMCE/js/plugins/fullpage/fullpage.htm +++ /dev/null @@ -1,259 +0,0 @@ - - - - {#fullpage_dlg.title} - - - - - - - -
    - - -
    -
    -
    - {#fullpage_dlg.meta_props} - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
     
     
     
     
      - -
    -
    - -
    - {#fullpage_dlg.langprops} - - - - - - - - - - - - - - - - - - - - - - -
    - -
      - -
     
    - -
     
    -
    -
    - -
    -
    - {#fullpage_dlg.appearance_textprops} - - - - - - - - - - - - - - - - -
    - -
    - -
    - - - - - -
     
    -
    -
    - -
    - {#fullpage_dlg.appearance_bgprops} - - - - - - - - - - -
    - - - - - -
     
    -
    - - - - - -
     
    -
    -
    - -
    - {#fullpage_dlg.appearance_marginprops} - - - - - - - - - - - - - - -
    -
    - -
    - {#fullpage_dlg.appearance_linkprops} - - - - - - - - - - - - - - - - - -
    - - - - - -
    -
    - - - - - -
     
    -
    - - - - - -
     
    -
      
    -
    - -
    - {#fullpage_dlg.appearance_style} - - - - - - - - - - -
    - - - - -
     
    -
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js b/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js deleted file mode 100644 index 3f672ad3ba..0000000000 --- a/plugins/TinyMCE/js/plugins/fullpage/js/fullpage.js +++ /dev/null @@ -1,232 +0,0 @@ -/** - * fullpage.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinyMCEPopup.requireLangPack(); - - var defaultDocTypes = - 'XHTML 1.0 Transitional=,' + - 'XHTML 1.0 Frameset=,' + - 'XHTML 1.0 Strict=,' + - 'XHTML 1.1=,' + - 'HTML 4.01 Transitional=,' + - 'HTML 4.01 Strict=,' + - 'HTML 4.01 Frameset='; - - var defaultEncodings = - 'Western european (iso-8859-1)=iso-8859-1,' + - 'Central European (iso-8859-2)=iso-8859-2,' + - 'Unicode (UTF-8)=utf-8,' + - 'Chinese traditional (Big5)=big5,' + - 'Cyrillic (iso-8859-5)=iso-8859-5,' + - 'Japanese (iso-2022-jp)=iso-2022-jp,' + - 'Greek (iso-8859-7)=iso-8859-7,' + - 'Korean (iso-2022-kr)=iso-2022-kr,' + - 'ASCII (us-ascii)=us-ascii'; - - var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; - var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; - - function setVal(id, value) { - var elm = document.getElementById(id); - - if (elm) { - value = value || ''; - - if (elm.nodeName == "SELECT") - selectByValue(document.forms[0], id, value); - else if (elm.type == "checkbox") - elm.checked = !!value; - else - elm.value = value; - } - }; - - function getVal(id) { - var elm = document.getElementById(id); - - if (elm.nodeName == "SELECT") - return elm.options[elm.selectedIndex].value; - - if (elm.type == "checkbox") - return elm.checked; - - return elm.value; - }; - - window.FullPageDialog = { - changedStyle : function() { - var val, styles = tinyMCEPopup.editor.dom.parseStyle(getVal('style')); - - setVal('fontface', styles['font-face']); - setVal('fontsize', styles['font-size']); - setVal('textcolor', styles['color']); - - if (val = styles['background-image']) - setVal('bgimage', val.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1")); - else - setVal('bgimage', ''); - - setVal('bgcolor', styles['background-color']); - - // Reset margin form elements - setVal('topmargin', ''); - setVal('rightmargin', ''); - setVal('bottommargin', ''); - setVal('leftmargin', ''); - - // Expand margin - if (val = styles['margin']) { - val = val.split(' '); - styles['margin-top'] = val[0] || ''; - styles['margin-right'] = val[1] || val[0] || ''; - styles['margin-bottom'] = val[2] || val[0] || ''; - styles['margin-left'] = val[3] || val[0] || ''; - } - - if (val = styles['margin-top']) - setVal('topmargin', val.replace(/px/, '')); - - if (val = styles['margin-right']) - setVal('rightmargin', val.replace(/px/, '')); - - if (val = styles['margin-bottom']) - setVal('bottommargin', val.replace(/px/, '')); - - if (val = styles['margin-left']) - setVal('leftmargin', val.replace(/px/, '')); - - updateColor('bgcolor_pick', 'bgcolor'); - updateColor('textcolor_pick', 'textcolor'); - }, - - changedStyleProp : function() { - var val, dom = tinyMCEPopup.editor.dom, styles = dom.parseStyle(getVal('style')); - - styles['font-face'] = getVal('fontface'); - styles['font-size'] = getVal('fontsize'); - styles['color'] = getVal('textcolor'); - styles['background-color'] = getVal('bgcolor'); - - if (val = getVal('bgimage')) - styles['background-image'] = "url('" + val + "')"; - else - styles['background-image'] = ''; - - delete styles['margin']; - - if (val = getVal('topmargin')) - styles['margin-top'] = val + "px"; - else - styles['margin-top'] = ''; - - if (val = getVal('rightmargin')) - styles['margin-right'] = val + "px"; - else - styles['margin-right'] = ''; - - if (val = getVal('bottommargin')) - styles['margin-bottom'] = val + "px"; - else - styles['margin-bottom'] = ''; - - if (val = getVal('leftmargin')) - styles['margin-left'] = val + "px"; - else - styles['margin-left'] = ''; - - // Serialize, parse and reserialize this will compress redundant styles - setVal('style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(styles)))); - this.changedStyle(); - }, - - update : function() { - var data = {}; - - tinymce.each(tinyMCEPopup.dom.select('select,input,textarea'), function(node) { - data[node.id] = getVal(node.id); - }); - - tinyMCEPopup.editor.plugins.fullpage._dataToHtml(data); - tinyMCEPopup.close(); - } - }; - - function init() { - var form = document.forms[0], i, item, list, editor = tinyMCEPopup.editor; - - // Setup doctype select box - list = editor.getParam("fullpage_doctypes", defaultDocTypes).split(','); - for (i = 0; i < list.length; i++) { - item = list[i].split('='); - - if (item.length > 1) - addSelectValue(form, 'doctype', item[0], item[1]); - } - - // Setup fonts select box - list = editor.getParam("fullpage_fonts", defaultFontNames).split(';'); - for (i = 0; i < list.length; i++) { - item = list[i].split('='); - - if (item.length > 1) - addSelectValue(form, 'fontface', item[0], item[1]); - } - - // Setup fontsize select box - list = editor.getParam("fullpage_fontsizes", defaultFontSizes).split(','); - for (i = 0; i < list.length; i++) - addSelectValue(form, 'fontsize', list[i], list[i]); - - // Setup encodings select box - list = editor.getParam("fullpage_encodings", defaultEncodings).split(','); - for (i = 0; i < list.length; i++) { - item = list[i].split('='); - - if (item.length > 1) - addSelectValue(form, 'docencoding', item[0], item[1]); - } - - // Setup color pickers - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); - document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); - document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); - document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); - document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); - document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); - - // Resize some elements - if (isVisible('stylesheetbrowser')) - document.getElementById('stylesheet').style.width = '220px'; - - if (isVisible('link_href_browser')) - document.getElementById('element_link_href').style.width = '230px'; - - if (isVisible('bgimage_browser')) - document.getElementById('bgimage').style.width = '210px'; - - // Update form - tinymce.each(tinyMCEPopup.getWindowArg('data'), function(value, key) { - setVal(key, value); - }); - - FullPageDialog.changedStyle(); - - // Update colors - updateColor('textcolor_pick', 'textcolor'); - updateColor('bgcolor_pick', 'bgcolor'); - updateColor('visited_color_pick', 'visited_color'); - updateColor('active_color_pick', 'active_color'); - updateColor('link_color_pick', 'link_color'); - }; - - tinyMCEPopup.onInit.add(init); -})(); diff --git a/plugins/TinyMCE/js/plugins/fullpage/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/fullpage/langs/en_dlg.js deleted file mode 100644 index f5801b8b31..0000000000 --- a/plugins/TinyMCE/js/plugins/fullpage/langs/en_dlg.js +++ /dev/null @@ -1,85 +0,0 @@ -tinyMCE.addI18n('en.fullpage_dlg',{ -title:"Document properties", -meta_tab:"General", -appearance_tab:"Appearance", -advanced_tab:"Advanced", -meta_props:"Meta information", -langprops:"Language and encoding", -meta_title:"Title", -meta_keywords:"Keywords", -meta_description:"Description", -meta_robots:"Robots", -doctypes:"Doctype", -langcode:"Language code", -langdir:"Language direction", -ltr:"Left to right", -rtl:"Right to left", -xml_pi:"XML declaration", -encoding:"Character encoding", -appearance_bgprops:"Background properties", -appearance_marginprops:"Body margins", -appearance_linkprops:"Link colors", -appearance_textprops:"Text properties", -bgcolor:"Background color", -bgimage:"Background image", -left_margin:"Left margin", -right_margin:"Right margin", -top_margin:"Top margin", -bottom_margin:"Bottom margin", -text_color:"Text color", -font_size:"Font size", -font_face:"Font face", -link_color:"Link color", -hover_color:"Hover color", -visited_color:"Visited color", -active_color:"Active color", -textcolor:"Color", -fontsize:"Font size", -fontface:"Font family", -meta_index_follow:"Index and follow the links", -meta_index_nofollow:"Index and don't follow the links", -meta_noindex_follow:"Do not index but follow the links", -meta_noindex_nofollow:"Do not index and don\'t follow the links", -appearance_style:"Stylesheet and style properties", -stylesheet:"Stylesheet", -style:"Style", -author:"Author", -copyright:"Copyright", -add:"Add new element", -remove:"Remove selected element", -moveup:"Move selected element up", -movedown:"Move selected element down", -head_elements:"Head elements", -info:"Information", -add_title:"Title element", -add_meta:"Meta element", -add_script:"Script element", -add_style:"Style element", -add_link:"Link element", -add_base:"Base element", -add_comment:"Comment node", -title_element:"Title element", -script_element:"Script element", -style_element:"Style element", -base_element:"Base element", -link_element:"Link element", -meta_element:"Meta element", -comment_element:"Comment", -src:"Src", -language:"Language", -href:"Href", -target:"Target", -type:"Type", -charset:"Charset", -defer:"Defer", -media:"Media", -properties:"Properties", -name:"Name", -value:"Value", -content:"Content", -rel:"Rel", -rev:"Rev", -hreflang:"Href lang", -general_props:"General", -advanced_props:"Advanced" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin.js b/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin.js deleted file mode 100644 index 6eae3ec84a..0000000000 --- a/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent({format:"raw"}),{format:"raw"});tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent({format:"raw"}),{format:"raw"});d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin_src.js deleted file mode 100644 index 3477c86c9b..0000000000 --- a/plugins/TinyMCE/js/plugins/fullscreen/editor_plugin_src.js +++ /dev/null @@ -1,159 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM; - - tinymce.create('tinymce.plugins.FullScreenPlugin', { - init : function(ed, url) { - var t = this, s = {}, vp, posCss; - - t.editor = ed; - - // Register commands - ed.addCommand('mceFullScreen', function() { - var win, de = DOM.doc.documentElement; - - if (ed.getParam('fullscreen_is_enabled')) { - if (ed.getParam('fullscreen_new_window')) - closeFullscreen(); // Call to close in new window - else { - DOM.win.setTimeout(function() { - tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc); - tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); - tinyMCE.remove(ed); - DOM.remove('mce_fullscreen_container'); - de.style.overflow = ed.getParam('fullscreen_html_overflow'); - DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow')); - DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly')); - tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings - }, 10); - } - - return; - } - - if (ed.getParam('fullscreen_new_window')) { - win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); - try { - win.resizeTo(screen.availWidth, screen.availHeight); - } catch (e) { - // Ignore - } - } else { - tinyMCE.oldSettings = tinyMCE.settings; // Store old settings - s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto'; - s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1); - vp = DOM.getViewPort(); - s.fullscreen_scrollx = vp.x; - s.fullscreen_scrolly = vp.y; - - // Fixes an Opera bug where the scrollbars doesn't reappear - if (tinymce.isOpera && s.fullscreen_overflow == 'visible') - s.fullscreen_overflow = 'auto'; - - // Fixes an IE bug where horizontal scrollbars would appear - if (tinymce.isIE && s.fullscreen_overflow == 'scroll') - s.fullscreen_overflow = 'auto'; - - // Fixes an IE bug where the scrollbars doesn't reappear - if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll')) - s.fullscreen_html_overflow = 'auto'; - - if (s.fullscreen_overflow == '0px') - s.fullscreen_overflow = ''; - - DOM.setStyle(DOM.doc.body, 'overflow', 'hidden'); - de.style.overflow = 'hidden'; //Fix for IE6/7 - vp = DOM.getViewPort(); - DOM.win.scrollTo(0, 0); - - if (tinymce.isIE) - vp.h -= 1; - - // Use fixed position if it exists - if (tinymce.isIE6) - posCss = 'absolute;top:' + vp.y; - else - posCss = 'fixed;top:0'; - - n = DOM.add(DOM.doc.body, 'div', { - id : 'mce_fullscreen_container', - style : 'position:' + posCss + ';left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'}); - DOM.add(n, 'div', {id : 'mce_fullscreen'}); - - tinymce.each(ed.settings, function(v, n) { - s[n] = v; - }); - - s.id = 'mce_fullscreen'; - s.width = n.clientWidth; - s.height = n.clientHeight - 15; - s.fullscreen_is_enabled = true; - s.fullscreen_editor_id = ed.id; - s.theme_advanced_resizing = false; - s.save_onsavecallback = function() { - ed.setContent(tinyMCE.get(s.id).getContent({format : 'raw'}), {format : 'raw'}); - ed.execCommand('mceSave'); - }; - - tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) { - s[k] = v; - }); - - if (s.theme_advanced_toolbar_location === 'external') - s.theme_advanced_toolbar_location = 'top'; - - t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s); - t.fullscreenEditor.onInit.add(function() { - t.fullscreenEditor.setContent(ed.getContent()); - t.fullscreenEditor.focus(); - }); - - t.fullscreenEditor.render(); - - t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container'); - t.fullscreenElement.update(); - //document.body.overflow = 'hidden'; - - t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() { - var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize; - - // Get outer/inner size to get a delta size that can be used to calc the new iframe size - outerSize = fed.dom.getSize(fed.getContainer().firstChild); - innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]); - - fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h); - }); - } - }); - - // Register buttons - ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'}); - - ed.onNodeChange.add(function(ed, cm) { - cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled')); - }); - }, - - getInfo : function() { - return { - longname : 'Fullscreen', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/fullscreen/fullscreen.htm b/plugins/TinyMCE/js/plugins/fullscreen/fullscreen.htm deleted file mode 100644 index 4c4f27e488..0000000000 --- a/plugins/TinyMCE/js/plugins/fullscreen/fullscreen.htm +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - -
    - -
    - - - - - diff --git a/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js b/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js deleted file mode 100644 index e9cba106c6..0000000000 --- a/plugins/TinyMCE/js/plugins/iespell/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js deleted file mode 100644 index 1b2bb98460..0000000000 --- a/plugins/TinyMCE/js/plugins/iespell/editor_plugin_src.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.IESpell', { - init : function(ed, url) { - var t = this, sp; - - if (!tinymce.isIE) - return; - - t.editor = ed; - - // Register commands - ed.addCommand('mceIESpell', function() { - try { - sp = new ActiveXObject("ieSpell.ieSpellExtension"); - sp.CheckDocumentNode(ed.getDoc().documentElement); - } catch (e) { - if (e.number == -2146827859) { - ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) { - if (s) - window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); - }); - } else - ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number); - } - }); - - // Register buttons - ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'}); - }, - - getInfo : function() { - return { - longname : 'IESpell (IE Only)', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js deleted file mode 100644 index ef648174f0..0000000000 --- a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","
    "));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;gf){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js deleted file mode 100644 index ac6fb1cb98..0000000000 --- a/plugins/TinyMCE/js/plugins/inlinepopups/editor_plugin_src.js +++ /dev/null @@ -1,696 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; - - tinymce.create('tinymce.plugins.InlinePopups', { - init : function(ed, url) { - // Replace window manager - ed.onBeforeRenderUI.add(function() { - ed.windowManager = new tinymce.InlineWindowManager(ed); - DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); - }); - }, - - getInfo : function() { - return { - longname : 'InlinePopups', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { - InlineWindowManager : function(ed) { - var t = this; - - t.parent(ed); - t.zIndex = 300000; - t.count = 0; - t.windows = {}; - }, - - open : function(f, p) { - var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u, parentWindow; - - f = f || {}; - p = p || {}; - - // Run native windows - if (!f.inline) - return t.parent(f, p); - - parentWindow = t._frontWindow(); - if (parentWindow && DOM.get(parentWindow.id + '_ifr')) { - parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement; - } - - // Only store selection if the type is a normal window - if (!f.type) - t.bookmark = ed.selection.getBookmark(1); - - id = DOM.uniqueId(); - vp = DOM.getViewPort(); - f.width = parseInt(f.width || 320); - f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); - f.min_width = parseInt(f.min_width || 150); - f.min_height = parseInt(f.min_height || 100); - f.max_width = parseInt(f.max_width || 2000); - f.max_height = parseInt(f.max_height || 2000); - f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); - f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); - f.movable = f.resizable = true; - p.mce_width = f.width; - p.mce_height = f.height; - p.mce_inline = true; - p.mce_window_id = id; - p.mce_auto_focus = f.auto_focus; - - // Transpose -// po = DOM.getPos(ed.getContainer()); -// f.left -= po.x; -// f.top -= po.y; - - t.features = f; - t.params = p; - t.onOpen.dispatch(t, f, p); - - if (f.type) { - opt += ' mceModal'; - - if (f.type) - opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1); - - f.resizable = false; - } - - if (f.statusbar) - opt += ' mceStatusbar'; - - if (f.resizable) - opt += ' mceResizable'; - - if (f.minimizable) - opt += ' mceMinimizable'; - - if (f.maximizable) - opt += ' mceMaximizable'; - - if (f.movable) - opt += ' mceMovable'; - - // Create DOM objects - t._addAll(DOM.doc.body, - ['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : (ed.settings.inlinepopups_skin || 'clearlooks2') + (tinymce.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'}, - ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt}, - ['div', {id : id + '_top', 'class' : 'mceTop'}, - ['div', {'class' : 'mceLeft'}], - ['div', {'class' : 'mceCenter'}], - ['div', {'class' : 'mceRight'}], - ['span', {id : id + '_title'}, f.title || ''] - ], - - ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, - ['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}], - ['span', {id : id + '_content'}], - ['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}] - ], - - ['div', {id : id + '_bottom', 'class' : 'mceBottom'}, - ['div', {'class' : 'mceLeft'}], - ['div', {'class' : 'mceCenter'}], - ['div', {'class' : 'mceRight'}], - ['span', {id : id + '_status'}, 'Content'] - ], - - ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}], - ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], - ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}], - ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}] - ] - ] - ); - - DOM.setStyles(id, {top : -10000, left : -10000}); - - // Fix gecko rendering bug, where the editors iframe messed with window contents - if (tinymce.isGecko) - DOM.setStyle(id, 'overflow', 'auto'); - - // Measure borders - if (!f.type) { - dw += DOM.get(id + '_left').clientWidth; - dw += DOM.get(id + '_right').clientWidth; - dh += DOM.get(id + '_top').clientHeight; - dh += DOM.get(id + '_bottom').clientHeight; - } - - // Resize window - DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); - - u = f.url || f.file; - if (u) { - if (tinymce.relaxedDomain) - u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain; - - u = tinymce._addVer(u); - } - - if (!f.type) { - DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); - DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); - DOM.setAttrib(id + '_ifr', 'src', u); - } else { - DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); - - if (f.type == 'confirm') - DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); - - DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'}); - DOM.setHTML(id + '_content', f.content.replace('\n', '
    ')); - - Event.add(id, 'keyup', function(evt) { - var VK_ESCAPE = 27; - if (evt.keyCode === VK_ESCAPE) { - f.button_func(false); - return Event.cancel(evt); - } - }); - - Event.add(id, 'keydown', function(evt) { - var cancelButton, VK_TAB = 9; - if (evt.keyCode === VK_TAB) { - cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0]; - if (cancelButton && cancelButton !== evt.target) { - cancelButton.focus(); - } else { - DOM.get(id + '_ok').focus(); - } - return Event.cancel(evt); - } - }); - } - - // Register events - mdf = Event.add(id, 'mousedown', function(e) { - var n = e.target, w, vp; - - w = t.windows[id]; - t.focus(id); - - if (n.nodeName == 'A' || n.nodeName == 'a') { - if (n.className == 'mceMax') { - w.oldPos = w.element.getXY(); - w.oldSize = w.element.getSize(); - - vp = DOM.getViewPort(); - - // Reduce viewport size to avoid scrollbars - vp.w -= 2; - vp.h -= 2; - - w.element.moveTo(vp.x, vp.y); - w.element.resizeTo(vp.w, vp.h); - DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); - DOM.addClass(id + '_wrapper', 'mceMaximized'); - } else if (n.className == 'mceMed') { - // Reset to old size - w.element.moveTo(w.oldPos.x, w.oldPos.y); - w.element.resizeTo(w.oldSize.w, w.oldSize.h); - w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); - - DOM.removeClass(id + '_wrapper', 'mceMaximized'); - } else if (n.className == 'mceMove') - return t._startDrag(id, e, n.className); - else if (DOM.hasClass(n, 'mceResize')) - return t._startDrag(id, e, n.className.substring(13)); - } - }); - - clf = Event.add(id, 'click', function(e) { - var n = e.target; - - t.focus(id); - - if (n.nodeName == 'A' || n.nodeName == 'a') { - switch (n.className) { - case 'mceClose': - t.close(null, id); - return Event.cancel(e); - - case 'mceButton mceOk': - case 'mceButton mceCancel': - f.button_func(n.className == 'mceButton mceOk'); - return Event.cancel(e); - } - } - }); - - // Make sure the tab order loops within the dialog. - Event.add([id + '_left', id + '_right'], 'focus', function(evt) { - var iframe = DOM.get(id + '_ifr'); - if (iframe) { - var body = iframe.contentWindow.document.body; - var focusable = DOM.select(':input:enabled,*[tabindex=0]', body); - if (evt.target.id === (id + '_left')) { - focusable[focusable.length - 1].focus(); - } else { - focusable[0].focus(); - } - } else { - DOM.get(id + '_ok').focus(); - } - }); - - // Add window - w = t.windows[id] = { - id : id, - mousedown_func : mdf, - click_func : clf, - element : new Element(id, {blocker : 1, container : ed.getContainer()}), - iframeElement : new Element(id + '_ifr'), - features : f, - deltaWidth : dw, - deltaHeight : dh - }; - - w.iframeElement.on('focus', function() { - t.focus(id); - }); - - // Setup blocker - if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { - DOM.add(DOM.doc.body, 'div', { - id : 'mceModalBlocker', - 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', - style : {zIndex : t.zIndex - 1} - }); - - DOM.show('mceModalBlocker'); // Reduces flicker in IE - DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true'); - } else - DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); - - if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) - DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); - - DOM.setAttrib(id, 'aria-hidden', 'false'); - t.focus(id); - t._fixIELayout(id, 1); - - // Focus ok button - if (DOM.get(id + '_ok')) - DOM.get(id + '_ok').focus(); - t.count++; - - return w; - }, - - focus : function(id) { - var t = this, w; - - if (w = t.windows[id]) { - w.zIndex = this.zIndex++; - w.element.setStyle('zIndex', w.zIndex); - w.element.update(); - - id = id + '_wrapper'; - DOM.removeClass(t.lastId, 'mceFocus'); - DOM.addClass(id, 'mceFocus'); - t.lastId = id; - - if (w.focussedElement) { - w.focussedElement.focus(); - } else if (DOM.get(id + '_ok')) { - DOM.get(w.id + '_ok').focus(); - } else if (DOM.get(w.id + '_ifr')) { - DOM.get(w.id + '_ifr').focus(); - } - } - }, - - _addAll : function(te, ne) { - var i, n, t = this, dom = tinymce.DOM; - - if (is(ne, 'string')) - te.appendChild(dom.doc.createTextNode(ne)); - else if (ne.length) { - te = te.appendChild(dom.create(ne[0], ne[1])); - - for (i=2; i ix) { - fw = w; - ix = w.zIndex; - } - }); - return fw; - }, - - setTitle : function(w, ti) { - var e; - - w = this._findId(w); - - if (e = DOM.get(w + '_title')) - e.innerHTML = DOM.encode(ti); - }, - - alert : function(txt, cb, s) { - var t = this, w; - - w = t.open({ - title : t, - type : 'alert', - button_func : function(s) { - if (cb) - cb.call(s || t, s); - - t.close(null, w.id); - }, - content : DOM.encode(t.editor.getLang(txt, txt)), - inline : 1, - width : 400, - height : 130 - }); - }, - - confirm : function(txt, cb, s) { - var t = this, w; - - w = t.open({ - title : t, - type : 'confirm', - button_func : function(s) { - if (cb) - cb.call(s || t, s); - - t.close(null, w.id); - }, - content : DOM.encode(t.editor.getLang(txt, txt)), - inline : 1, - width : 400, - height : 130 - }); - }, - - // Internal functions - - _findId : function(w) { - var t = this; - - if (typeof(w) == 'string') - return w; - - each(t.windows, function(wo) { - var ifr = DOM.get(wo.id + '_ifr'); - - if (ifr && w == ifr.contentWindow) { - w = wo.id; - return false; - } - }); - - return w; - }, - - _fixIELayout : function(id, s) { - var w, img; - - if (!tinymce.isIE6) - return; - - // Fixes the bug where hover flickers and does odd things in IE6 - each(['n','s','w','e','nw','ne','sw','se'], function(v) { - var e = DOM.get(id + '_resize_' + v); - - DOM.setStyles(e, { - width : s ? e.clientWidth : '', - height : s ? e.clientHeight : '', - cursor : DOM.getStyle(e, 'cursor', 1) - }); - - DOM.setStyle(id + "_bottom", 'bottom', '-1px'); - - e = 0; - }); - - // Fixes graphics glitch - if (w = this.windows[id]) { - // Fixes rendering bug after resize - w.element.hide(); - w.element.show(); - - // Forced a repaint of the window - //DOM.get(id).style.filter = ''; - - // IE has a bug where images used in CSS won't get loaded - // sometimes when the cache in the browser is disabled - // This fix tries to solve it by loading the images using the image object - each(DOM.select('div,a', id), function(e, i) { - if (e.currentStyle.backgroundImage != 'none') { - img = new Image(); - img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); - } - }); - - DOM.get(id).style.filter = ''; - } - } - }); - - // Register plugin - tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); -})(); - diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/alert.gif deleted file mode 100644 index 219139857ead162c6c83fa92e4a36eb978359b70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 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 QatMOy3rC81I1F^)55?|uDF6Tf diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif deleted file mode 100644 index c2a2ad454db194e428a7b9da40f62d5376a17428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmb7?=`WiB0LI^D)(HC`v6*aD4AW#LGRb0Oi$tH~CP=nb%N%8n zy02ceuewTUUDeW|RaMp*TlLV6R$o=rQOY{@AME+?`}QQiCwU%4Jq)?`{5B8=ECT1T z+wH!7{zji$)-UA>D9({)xO1SJGLHK54Mat(}s4_unMiKjB85EHng*~!Ddt+?(c5uHG4ZI zsc>jP#5Y6w6Wj5!Y=0^oK*&D+R;Yh@ze z7vfi;qFW{owiOfGqcB@XkwUZ0j?Km4{qjE- z6c!Z|O1!?5l~+^}tE#*^aCo0?lZ$rLKBwT;dI+nLO(UEMvb-ad9elEWPw8Xg(t zx$y<#6T+{PQ@$ecjAT|iC%dxnP5yoH$I`OLFU5*drPiz>bidcu^@a^2v}rP3-`?4^ z?Cl>M-Z(n8ot*x$0~Z|;ku35!-qAHSQN*GM3tW8AN#VWJNrHQD+6qXfO_zB^6eFVU zOjzupAb0*`W8} zQVeE5Djt<a0+Owme6r2OGio7DoTWqkhGKj0`0*1-*<$#uL5YH*kC8Z>wpCvYO~asp;G r-~A;>$wp)vkltB=c_?k6Zw*FUgrbAm;sB08O9+}m=}H3OFd*zN8L+JA diff --git a/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/plugins/TinyMCE/js/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif deleted file mode 100644 index 0b4cc3682a1c62b3583d83ad83b84fce14461ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmZ?wbh9u| --> - - -Template for dialogs - - - - -
    -
    -
    -
    -
    -
    -
    - Blured -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Focused -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Statusbar -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Statusbar, Resizable -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Resizable, Maximizable -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Blurred, Maximizable, Statusbar, Resizable -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Maximized, Maximizable, Minimizable -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Blured -
    - -
    -
    - Content -
    -
    - -
    -
    -
    -
    - Statusbar text. -
    - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - Alert -
    - -
    -
    - - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - -
    -
    -
    - -
    -
    -
    -
    -
    - - - Ok - -
    -
    - -
    -
    -
    -
    -
    -
    - Confirm -
    - -
    -
    - - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - This is a very long error message. This is a very long error message. - -
    -
    -
    - -
    -
    -
    -
    -
    - - - Ok - Cancel - -
    -
    -
    - - - diff --git a/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js b/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js deleted file mode 100644 index 938ce6b17d..0000000000 --- a/plugins/TinyMCE/js/plugins/insertdatetime/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;fg[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.dom.setAttrib(b,"data-mce-style","");a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js deleted file mode 100644 index a8ac5a72fc..0000000000 --- a/plugins/TinyMCE/js/plugins/layer/editor_plugin_src.js +++ /dev/null @@ -1,214 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Layer', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceInsertLayer', t._insertLayer, t); - - ed.addCommand('mceMoveForward', function() { - t._move(1); - }); - - ed.addCommand('mceMoveBackward', function() { - t._move(-1); - }); - - ed.addCommand('mceMakeAbsolute', function() { - t._toggleAbsolute(); - }); - - // Register buttons - ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'}); - ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'}); - ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'}); - ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'}); - - ed.onInit.add(function() { - if (tinymce.isIE) - ed.getDoc().execCommand('2D-Position', false, true); - }); - - ed.onNodeChange.add(t._nodeChange, t); - ed.onVisualAid.add(t._visualAid, t); - }, - - getInfo : function() { - return { - longname : 'Layer', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var le, p; - - le = this._getParentLayer(n); - p = ed.dom.getParent(n, 'DIV,P,IMG'); - - if (!p) { - cm.setDisabled('absolute', 1); - cm.setDisabled('moveforward', 1); - cm.setDisabled('movebackward', 1); - } else { - cm.setDisabled('absolute', 0); - cm.setDisabled('moveforward', !le); - cm.setDisabled('movebackward', !le); - cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute"); - } - }, - - // Private methods - - _visualAid : function(ed, e, s) { - var dom = ed.dom; - - tinymce.each(dom.select('div,p', e), function(e) { - if (/^(absolute|relative|static)$/i.test(e.style.position)) { - if (s) - dom.addClass(e, 'mceItemVisualAid'); - else - dom.removeClass(e, 'mceItemVisualAid'); - } - }); - }, - - _move : function(d) { - var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl; - - nl = []; - tinymce.walk(ed.getBody(), function(n) { - if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position)) - nl.push(n); - }, 'childNodes'); - - // Find z-indexes - for (i=0; i -1) { - nl[ci].style.zIndex = z[fi]; - nl[fi].style.zIndex = z[ci]; - } else { - if (z[ci] > 0) - nl[ci].style.zIndex = z[ci] - 1; - } - } else { - // Move forward - - // Try find a higher one - for (i=0; i z[ci]) { - fi = i; - break; - } - } - - if (fi > -1) { - nl[ci].style.zIndex = z[fi]; - nl[fi].style.zIndex = z[ci]; - } else - nl[ci].style.zIndex = z[ci] + 1; - } - - ed.execCommand('mceRepaint'); - }, - - _getParentLayer : function(n) { - return this.editor.dom.getParent(n, function(n) { - return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position); - }); - }, - - _insertLayer : function() { - var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*')); - - ed.dom.add(ed.getBody(), 'div', { - style : { - position : 'absolute', - left : p.x, - top : (p.y > 20 ? p.y : 20), - width : 100, - height : 100 - }, - 'class' : 'mceItemVisualAid' - }, ed.selection.getContent() || ed.getLang('layer.content')); - }, - - _toggleAbsolute : function() { - var ed = this.editor, le = this._getParentLayer(ed.selection.getNode()); - - if (!le) - le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG'); - - if (le) { - if (le.style.position.toLowerCase() == "absolute") { - ed.dom.setStyles(le, { - position : '', - left : '', - top : '', - width : '', - height : '' - }); - - ed.dom.removeClass(le, 'mceItemVisualAid'); - } else { - if (le.style.left == "") - le.style.left = 20 + 'px'; - - if (le.style.top == "") - le.style.top = 20 + 'px'; - - if (le.style.width == "") - le.style.width = le.width ? (le.width + 'px') : '100px'; - - if (le.style.height == "") - le.style.height = le.height ? (le.height + 'px') : '100px'; - - le.style.position = "absolute"; - - ed.dom.setAttrib(le, 'data-mce-style', ''); - ed.addVisual(ed.getBody()); - } - - ed.execCommand('mceRepaint'); - ed.nodeChanged(); - } - } - }); - - // Register plugin - tinymce.PluginManager.add('layer', tinymce.plugins.Layer); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js deleted file mode 100644 index b3a4ce31c5..0000000000 --- a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js deleted file mode 100644 index e627ec76e4..0000000000 --- a/plugins/TinyMCE/js/plugins/legacyoutput/editor_plugin_src.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - * - * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align - * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash - * - * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are - * not apart of the newer specifications for HTML and XHTML. - */ - -(function(tinymce) { - // Override inline_styles setting to force TinyMCE to produce deprecated contents - tinymce.onAddEditor.addToTop(function(tinymce, editor) { - editor.settings.inline_styles = false; - }); - - // Create the legacy ouput plugin - tinymce.create('tinymce.plugins.LegacyOutput', { - init : function(editor) { - editor.onInit.add(function() { - var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', - fontSizes = tinymce.explode(editor.settings.font_size_style_values), - schema = editor.schema; - - // Override some internal formats to produce legacy elements and attributes - editor.formatter.register({ - // Change alignment formats to use the deprecated align attribute - alignleft : {selector : alignElements, attributes : {align : 'left'}}, - aligncenter : {selector : alignElements, attributes : {align : 'center'}}, - alignright : {selector : alignElements, attributes : {align : 'right'}}, - alignfull : {selector : alignElements, attributes : {align : 'justify'}}, - - // Change the basic formatting elements to use deprecated element types - bold : [ - {inline : 'b', remove : 'all'}, - {inline : 'strong', remove : 'all'}, - {inline : 'span', styles : {fontWeight : 'bold'}} - ], - italic : [ - {inline : 'i', remove : 'all'}, - {inline : 'em', remove : 'all'}, - {inline : 'span', styles : {fontStyle : 'italic'}} - ], - underline : [ - {inline : 'u', remove : 'all'}, - {inline : 'span', styles : {textDecoration : 'underline'}, exact : true} - ], - strikethrough : [ - {inline : 'strike', remove : 'all'}, - {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true} - ], - - // Change font size and font family to use the deprecated font element - fontname : {inline : 'font', attributes : {face : '%value'}}, - fontsize : { - inline : 'font', - attributes : { - size : function(vars) { - return tinymce.inArray(fontSizes, vars.value) + 1; - } - } - }, - - // Setup font elements for colors as well - forecolor : {inline : 'font', styles : {color : '%value'}}, - hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}} - }); - - // Check that deprecated elements are allowed if not add them - tinymce.each('b,i,u,strike'.split(','), function(name) { - schema.addValidElements(name + '[*]'); - }); - - // Add font element if it's missing - if (!schema.getElementRule("font")) - schema.addValidElements("font[face|size|color|style]"); - - // Add the missing and depreacted align attribute for the serialization engine - tinymce.each(alignElements.split(','), function(name) { - var rule = schema.getElementRule(name), found; - - if (rule) { - if (!rule.attributes.align) { - rule.attributes.align = {}; - rule.attributesOrder.push('align'); - } - } - }); - - // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes - editor.onNodeChange.add(function(editor, control_manager) { - var control, fontElm, fontName, fontSize; - - // Find font element get it's name and size - fontElm = editor.dom.getParent(editor.selection.getNode(), 'font'); - if (fontElm) { - fontName = fontElm.face; - fontSize = fontElm.size; - } - - // Select/unselect the font name in droplist - if (control = control_manager.get('fontselect')) { - control.select(function(value) { - return value == fontName; - }); - } - - // Select/unselect the font size in droplist - if (control = control_manager.get('fontsizeselect')) { - control.select(function(value) { - var index = tinymce.inArray(fontSizes, value.fontSize); - - return index + 1 == fontSize; - }); - } - }); - }); - }, - - getInfo : function() { - return { - longname : 'LegacyOutput', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput); -})(tinymce); diff --git a/plugins/TinyMCE/js/plugins/lists/editor_plugin.js b/plugins/TinyMCE/js/plugins/lists/editor_plugin.js deleted file mode 100644 index 0fb8263eda..0000000000 --- a/plugins/TinyMCE/js/plugins/lists/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{if(v&&u.tagName==="P"&&t.tagName==="P"){return true}else{return false}}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(u,v){var s=false;function y(z){return z.keyCode===9&&(u.queryCommandState("InsertUnorderedList")||u.queryCommandState("InsertOrderedList"))}function w(z,B){var A=z.selection,C;if(B.keyCode===13){C=A.getStart();if(C.tagName=="BR"&&C.parentNode.tagName=="LI"){C=C.parentNode}s=A.isCollapsed()&&C&&C.tagName==="LI"&&(C.childNodes.length===0||(C.firstChild.nodeName=="BR"&&C.childNodes.length===1));return s}}function t(z,A){if(y(A)||w(z,A)){return r.cancel(A)}}function x(C,E){if(!tinymce.isGecko){return}var A=C.selection.getStart();if(E.keyCode!=8||A.tagName!=="IMG"){return}function B(K){var L=K.firstChild;var J=null;do{if(!L){break}if(L.tagName==="LI"){J=L}}while(L=L.nextSibling);return J}function I(K,J){while(K.childNodes.length>0){J.appendChild(K.childNodes[0])}}var F;if(A.parentNode.previousSibling.tagName==="UL"||A.parentNode.previousSibling.tagName==="OL"){F=A.parentNode.previousSibling}else{if(A.parentNode.previousSibling.previousSibling.tagName==="UL"||A.parentNode.previousSibling.previousSibling.tagName==="OL"){F=A.parentNode.previousSibling.previousSibling}else{return}}var H=B(F);var z=C.dom.createRng();z.setStart(H,1);z.setEnd(H,1);C.selection.setRng(z);C.selection.collapse(true);var D=C.selection.getBookmark();var G=A.parentNode.cloneNode(true);if(G.tagName==="P"||G.tagName==="DIV"){I(G,H)}else{H.appendChild(G)}A.parentNode.parentNode.removeChild(A.parentNode);C.selection.moveToBookmark(D)}this.ed=u;u.addCommand("Indent",this.indent,this);u.addCommand("Outdent",this.outdent,this);u.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);u.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);u.onInit.add(function(){u.editorCommands.addCommands({outdent:function(){var A=u.selection,B=u.dom;function z(C){C=B.getParent(C,B.isBlock);return C&&(parseInt(u.dom.getStyle(C,"margin-left")||0,10)+parseInt(u.dom.getStyle(C,"padding-left")||0,10))>0}return z(A.getStart())||z(A.getEnd())||u.queryCommandState("InsertOrderedList")||u.queryCommandState("InsertUnorderedList")}},"state")});u.onKeyUp.add(function(A,B){var C,z;if(y(B)){A.execCommand(B.shiftKey?"Outdent":"Indent",true,null);return r.cancel(B)}else{if(s&&w(A,B)){if(A.queryCommandState("InsertOrderedList")){A.execCommand("InsertOrderedList")}else{A.execCommand("InsertUnorderedList")}C=A.selection.getStart();if(C&&C.tagName==="LI"){C=A.dom.getParent(C,"ol,ul").nextSibling;if(C&&C.tagName==="P"){if(!C.firstChild){C.appendChild(A.getDoc().createTextNode(""))}z=A.dom.createRng();z.setStart(C.firstChild,1);z.setEnd(C.firstChild,1);A.selection.setRng(z)}}return r.cancel(B)}}});u.onKeyPress.add(t);u.onKeyDown.add(t);u.onKeyDown.add(x)},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O,Q){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(M.tagName==="P"||G.length>1){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true);return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(Q,L,O){var t,P=Q,N,M;while(!I.isBlock(Q.parentNode)&&Q.parentNode!==I.getRoot()){Q=I.split(Q.parentNode,Q.previousSibling);Q=Q.nextSibling;P=Q}if(O){t=O.cloneNode(true);Q.parentNode.insertBefore(t,Q);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");Q.parentNode.insertBefore(t,Q)}while(P&&P!=L){N=P.nextSibling;t.appendChild(P);P=N}if(t.childNodes.length===0){t.innerHTML='
    '}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(V){var U;if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(P(N,V)){I.addClass(V,"_mce_tagged_br");N=S(V)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D}}else{B={defaultAction:x}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true)})},outdent:function(){var v=this,u=v.ed,w=u.dom,s=[];function x(t){var z,y,A;if(!d(u,t,s)){if(w.getStyle(t,"margin-left")!==""||w.getStyle(t,"padding-left")!==""){return v.adjustPaddingFunction(false)(t)}A=w.getStyle(t,"text-align",true);if(A==="center"||A==="right"){w.setStyle(t,"text-align","left");return}t=c(t,w);z=t.parentNode;y=t.parentNode.parentNode;if(y.tagName==="P"){w.split(y,t.parentNode)}else{w.split(z,t);if(y.tagName==="LI"){w.split(y,t)}else{if(!w.is(y,"ol,ul")){w.rename(t,"p")}}}s.push(t)}}this.process({LI:x,defaultAction:this.adjustPaddingFunction(false)});e(s,m)},process:function(x){var B=this,v=B.ed.selection,y=B.ed.dom,A,s;function w(t){y.removeClass(t,"_mce_act_on");if(!t||t.nodeType!==1){return}t=k(t,y);var C=x[t.tagName];if(!C){C=x.defaultAction}C(t)}function u(t){B.splitSafeEach(t.childNodes,w)}function z(t,C){return C>=0&&t.hasChildNodes()&&C0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}()); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/lists/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/lists/editor_plugin_src.js deleted file mode 100644 index 3952cff40a..0000000000 --- a/plugins/TinyMCE/js/plugins/lists/editor_plugin_src.js +++ /dev/null @@ -1,688 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2011, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var each = tinymce.each, Event = tinymce.dom.Event, bookmark; - - // Skips text nodes that only contain whitespace since they aren't semantically important. - function skipWhitespaceNodes(e, next) { - while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) { - e = next(e); - } - return e; - } - - function skipWhitespaceNodesBackwards(e) { - return skipWhitespaceNodes(e, function(e) { return e.previousSibling; }); - } - - function skipWhitespaceNodesForwards(e) { - return skipWhitespaceNodes(e, function(e) { return e.nextSibling; }); - } - - function hasParentInList(ed, e, list) { - return ed.dom.getParent(e, function(p) { - return tinymce.inArray(list, p) !== -1; - }); - } - - function isList(e) { - return e && (e.tagName === 'OL' || e.tagName === 'UL'); - } - - function splitNestedLists(element, dom) { - var tmp, nested, wrapItem; - tmp = skipWhitespaceNodesBackwards(element.lastChild); - while (isList(tmp)) { - nested = tmp; - tmp = skipWhitespaceNodesBackwards(nested.previousSibling); - } - if (nested) { - wrapItem = dom.create('li', { style: 'list-style-type: none;'}); - dom.split(element, nested); - dom.insertAfter(wrapItem, nested); - wrapItem.appendChild(nested); - wrapItem.appendChild(nested); - element = wrapItem.previousSibling; - } - return element; - } - - function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) { - e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs); - return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs); - } - - function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) { - var prev = skipWhitespaceNodesBackwards(e.previousSibling); - if (prev) { - return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs); - } else { - return e; - } - } - - function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) { - var next = skipWhitespaceNodesForwards(e.nextSibling); - if (next) { - return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs); - } else { - return e; - } - } - - function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) { - if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) { - return merge(e1, e2, differentStylesMasterElement); - } else if (e1 && e1.tagName === 'LI' && isList(e2)) { - // Fix invalidly nested lists. - e1.appendChild(e2); - } - return e2; - } - - function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) { - if (!e1 || !e2) { - return false; - } else if (e1.tagName === 'LI' && e2.tagName === 'LI') { - return e2.style.listStyleType === 'none' || containsOnlyAList(e2); - } else if (isList(e1)) { - return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2); - } else if (mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P') { - return true; - } else { - return false; - } - } - - function isListForIndent(e) { - var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild); - return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI)); - } - - function containsOnlyAList(e) { - var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild); - return firstChild && lastChild && firstChild === lastChild && isList(firstChild); - } - - function merge(e1, e2, masterElement) { - var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild); - if (e1.tagName === 'P') { - e1.appendChild(e1.ownerDocument.createElement('br')); - } - while (e2.firstChild) { - e1.appendChild(e2.firstChild); - } - if (masterElement) { - e1.style.listStyleType = masterElement.style.listStyleType; - } - e2.parentNode.removeChild(e2); - attemptMerge(lastOriginal, firstNew, false); - return e1; - } - - function findItemToOperateOn(e, dom) { - var item; - if (!dom.is(e, 'li,ol,ul')) { - item = dom.getParent(e, 'li'); - if (item) { - e = item; - } - } - return e; - } - - tinymce.create('tinymce.plugins.Lists', { - init: function(ed, url) { - var enterDownInEmptyList = false; - - function isTriggerKey(e) { - return e.keyCode === 9 && (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList')); - }; - - function isEnterInEmptyListItem(ed, e) { - var sel = ed.selection, n; - if (e.keyCode === 13) { - n = sel.getStart(); - - // Get start will return BR if the LI only contains a BR - if (n.tagName == 'BR' && n.parentNode.tagName == 'LI') - n = n.parentNode; - - // Check for empty LI or a LI with just one BR since Gecko and WebKit uses BR elements to place the caret - enterDownInEmptyList = sel.isCollapsed() && n && n.tagName === 'LI' && (n.childNodes.length === 0 || (n.firstChild.nodeName == 'BR' && n.childNodes.length === 1)); - return enterDownInEmptyList; - } - }; - - function cancelKeys(ed, e) { - if (isTriggerKey(e) || isEnterInEmptyListItem(ed, e)) { - return Event.cancel(e); - } - }; - - function imageJoiningListItem(ed, e) { - if (!tinymce.isGecko) - return; - - var n = ed.selection.getStart(); - if (e.keyCode != 8 || n.tagName !== 'IMG') - return; - - function lastLI(node) { - var child = node.firstChild; - var li = null; - do { - if (!child) - break; - - if (child.tagName === 'LI') - li = child; - } while (child = child.nextSibling); - - return li; - } - - function addChildren(parentNode, destination) { - while (parentNode.childNodes.length > 0) - destination.appendChild(parentNode.childNodes[0]); - } - - var ul; - if (n.parentNode.previousSibling.tagName === 'UL' || n.parentNode.previousSibling.tagName === 'OL') - ul = n.parentNode.previousSibling; - else if (n.parentNode.previousSibling.previousSibling.tagName === 'UL' || n.parentNode.previousSibling.previousSibling.tagName === 'OL') - ul = n.parentNode.previousSibling.previousSibling; - else - return; - - var li = lastLI(ul); - - // move the caret to the end of the list item - var rng = ed.dom.createRng(); - rng.setStart(li, 1); - rng.setEnd(li, 1); - ed.selection.setRng(rng); - ed.selection.collapse(true); - - // save a bookmark at the end of the list item - var bookmark = ed.selection.getBookmark(); - - // copy the image an its text to the list item - var clone = n.parentNode.cloneNode(true); - if (clone.tagName === 'P' || clone.tagName === 'DIV') - addChildren(clone, li); - else - li.appendChild(clone); - - // remove the old copy of the image - n.parentNode.parentNode.removeChild(n.parentNode); - - // move the caret where we saved the bookmark - ed.selection.moveToBookmark(bookmark); - } - - this.ed = ed; - ed.addCommand('Indent', this.indent, this); - ed.addCommand('Outdent', this.outdent, this); - ed.addCommand('InsertUnorderedList', function() { - this.applyList('UL', 'OL'); - }, this); - ed.addCommand('InsertOrderedList', function() { - this.applyList('OL', 'UL'); - }, this); - - ed.onInit.add(function() { - ed.editorCommands.addCommands({ - 'outdent': function() { - var sel = ed.selection, dom = ed.dom; - function hasStyleIndent(n) { - n = dom.getParent(n, dom.isBlock); - return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0; - } - return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList'); - } - }, 'state'); - }); - - ed.onKeyUp.add(function(ed, e) { - var n, rng; - if (isTriggerKey(e)) { - ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null); - return Event.cancel(e); - } else if (enterDownInEmptyList && isEnterInEmptyListItem(ed, e)) { - if (ed.queryCommandState('InsertOrderedList')) { - ed.execCommand('InsertOrderedList'); - } else { - ed.execCommand('InsertUnorderedList'); - } - n = ed.selection.getStart(); - if (n && n.tagName === 'LI') { - // Fix the caret position on IE since it jumps back up to the previous list item. - n = ed.dom.getParent(n, 'ol,ul').nextSibling; - if (n && n.tagName === 'P') { - if (!n.firstChild) { - n.appendChild(ed.getDoc().createTextNode('')); - } - rng = ed.dom.createRng(); - rng.setStart(n.firstChild, 1); - rng.setEnd(n.firstChild, 1); - ed.selection.setRng(rng); - } - } - return Event.cancel(e); - } - }); - ed.onKeyPress.add(cancelKeys); - ed.onKeyDown.add(cancelKeys); - ed.onKeyDown.add(imageJoiningListItem); - }, - - applyList: function(targetListType, oppositeListType) { - var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions, - selectedBlocks = ed.selection.getSelectedBlocks(); - - function cleanupBr(e) { - if (e && e.tagName === 'BR') { - dom.remove(e); - } - } - - function makeList(element) { - var list = dom.create(targetListType), li; - function adjustIndentForNewList(element) { - // If there's a margin-left, outdent one level to account for the extra list margin. - if (element.style.marginLeft || element.style.paddingLeft) { - t.adjustPaddingFunction(false)(element); - } - } - - if (element.tagName === 'LI') { - // No change required. - } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') { - processBrs(element, function(startSection, br, previousBR) { - doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode); - li = startSection.parentNode; - adjustIndentForNewList(li); - cleanupBr(br); - }); - if (element.tagName === 'P' || selectedBlocks.length > 1) { - dom.split(li.parentNode.parentNode, li.parentNode); - } - attemptMergeWithAdjacent(li.parentNode, true); - return; - } else { - // Put the list around the element. - li = dom.create('li'); - dom.insertAfter(li, element); - li.appendChild(element); - adjustIndentForNewList(element); - element = li; - } - dom.insertAfter(list, element); - list.appendChild(element); - attemptMergeWithAdjacent(list, true); - applied.push(element); - } - - function doWrapList(start, end, template) { - var li, n = start, tmp, i; - while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) { - start = dom.split(start.parentNode, start.previousSibling); - start = start.nextSibling; - n = start; - } - if (template) { - li = template.cloneNode(true); - start.parentNode.insertBefore(li, start); - while (li.firstChild) dom.remove(li.firstChild); - li = dom.rename(li, 'li'); - } else { - li = dom.create('li'); - start.parentNode.insertBefore(li, start); - } - while (n && n != end) { - tmp = n.nextSibling; - li.appendChild(n); - n = tmp; - } - if (li.childNodes.length === 0) { - li.innerHTML = '
    '; - } - makeList(li); - } - - function processBrs(element, callback) { - var startSection, previousBR, END_TO_START = 3, START_TO_END = 1, - breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl'; - function isAnyPartSelected(start, end) { - var r = dom.createRng(), sel; - bookmark.keep = true; - ed.selection.moveToBookmark(bookmark); - bookmark.keep = false; - sel = ed.selection.getRng(true); - if (!end) { - end = start.parentNode.lastChild; - } - r.setStartBefore(start); - r.setEndAfter(end); - return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0); - } - function nextLeaf(br) { - if (br.nextSibling) - return br.nextSibling; - if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot()) - return nextLeaf(br.parentNode); - } - // Split on BRs within the range and process those. - startSection = element.firstChild; - // First mark the BRs that have any part of the previous section selected. - var trailingContentSelected = false; - each(dom.select(breakElements, element), function(br) { - var b; - if (br.hasAttribute && br.hasAttribute('_mce_bogus')) { - return true; // Skip the bogus Brs that are put in to appease Firefox and Safari. - } - if (isAnyPartSelected(startSection, br)) { - dom.addClass(br, '_mce_tagged_br'); - startSection = nextLeaf(br); - } - }); - trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined)); - startSection = element.firstChild; - each(dom.select(breakElements, element), function(br) { - // Got a section from start to br. - var tmp = nextLeaf(br); - if (br.hasAttribute && br.hasAttribute('_mce_bogus')) { - return true; // Skip the bogus Brs that are put in to appease Firefox and Safari. - } - if (dom.hasClass(br, '_mce_tagged_br')) { - callback(startSection, br, previousBR); - previousBR = null; - } else { - previousBR = br; - } - startSection = tmp; - }); - if (trailingContentSelected) { - callback(startSection, undefined, previousBR); - } - } - - function wrapList(element) { - processBrs(element, function(startSection, br, previousBR) { - // Need to indent this part - doWrapList(startSection, br); - cleanupBr(br); - cleanupBr(previousBR); - }); - } - - function changeList(element) { - if (tinymce.inArray(applied, element) !== -1) { - return; - } - if (element.parentNode.tagName === oppositeListType) { - dom.split(element.parentNode, element); - makeList(element); - attemptMergeWithNext(element.parentNode, false); - } - applied.push(element); - } - - function convertListItemToParagraph(element) { - var child, nextChild, mergedElement, splitLast; - if (tinymce.inArray(applied, element) !== -1) { - return; - } - element = splitNestedLists(element, dom); - while (dom.is(element.parentNode, 'ol,ul,li')) { - dom.split(element.parentNode, element); - } - // Push the original element we have from the selection, not the renamed one. - applied.push(element); - element = dom.rename(element, 'p'); - mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines); - if (mergedElement === element) { - // Now split out any block elements that can't be contained within a P. - // Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each) - child = element.firstChild; - while (child) { - if (dom.isBlock(child)) { - child = dom.split(child.parentNode, child); - splitLast = true; - nextChild = child.nextSibling && child.nextSibling.firstChild; - } else { - nextChild = child.nextSibling; - if (splitLast && child.tagName === 'BR') { - dom.remove(child); - } - splitLast = false; - } - child = nextChild; - } - } - } - - each(selectedBlocks, function(e) { - e = findItemToOperateOn(e, dom); - if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) { - hasOppositeType = true; - } else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) { - hasSameType = true; - } else { - hasNonList = true; - } - }); - - if (hasNonList || hasOppositeType || selectedBlocks.length === 0) { - actions = { - 'LI': changeList, - 'H1': makeList, - 'H2': makeList, - 'H3': makeList, - 'H4': makeList, - 'H5': makeList, - 'H6': makeList, - 'P': makeList, - 'BODY': makeList, - 'DIV': selectedBlocks.length > 1 ? makeList : wrapList, - defaultAction: wrapList - }; - } else { - actions = { - defaultAction: convertListItemToParagraph - }; - } - this.process(actions); - }, - - indent: function() { - var ed = this.ed, dom = ed.dom, indented = []; - - function createWrapItem(element) { - var wrapItem = dom.create('li', { style: 'list-style-type: none;'}); - dom.insertAfter(wrapItem, element); - return wrapItem; - } - - function createWrapList(element) { - var wrapItem = createWrapItem(element), - list = dom.getParent(element, 'ol,ul'), - listType = list.tagName, - listStyle = dom.getStyle(list, 'list-style-type'), - attrs = {}, - wrapList; - if (listStyle !== '') { - attrs.style = 'list-style-type: ' + listStyle + ';'; - } - wrapList = dom.create(listType, attrs); - wrapItem.appendChild(wrapList); - return wrapList; - } - - function indentLI(element) { - if (!hasParentInList(ed, element, indented)) { - element = splitNestedLists(element, dom); - var wrapList = createWrapList(element); - wrapList.appendChild(element); - attemptMergeWithAdjacent(wrapList.parentNode, false); - attemptMergeWithAdjacent(wrapList, false); - indented.push(element); - } - } - - this.process({ - 'LI': indentLI, - defaultAction: this.adjustPaddingFunction(true) - }); - - }, - - outdent: function() { - var t = this, ed = t.ed, dom = ed.dom, outdented = []; - - function outdentLI(element) { - var listElement, targetParent, align; - if (!hasParentInList(ed, element, outdented)) { - if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') { - return t.adjustPaddingFunction(false)(element); - } - align = dom.getStyle(element, 'text-align', true); - if (align === 'center' || align === 'right') { - dom.setStyle(element, 'text-align', 'left'); - return; - } - element = splitNestedLists(element, dom); - listElement = element.parentNode; - targetParent = element.parentNode.parentNode; - if (targetParent.tagName === 'P') { - dom.split(targetParent, element.parentNode); - } else { - dom.split(listElement, element); - if (targetParent.tagName === 'LI') { - // Nested list, need to split the LI and go back out to the OL/UL element. - dom.split(targetParent, element); - } else if (!dom.is(targetParent, 'ol,ul')) { - dom.rename(element, 'p'); - } - } - outdented.push(element); - } - } - - this.process({ - 'LI': outdentLI, - defaultAction: this.adjustPaddingFunction(false) - }); - - each(outdented, attemptMergeWithAdjacent); - }, - - process: function(actions) { - var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r; - function processElement(element) { - dom.removeClass(element, '_mce_act_on'); - if (!element || element.nodeType !== 1) { - return; - } - element = findItemToOperateOn(element, dom); - var action = actions[element.tagName]; - if (!action) { - action = actions.defaultAction; - } - action(element); - } - function recurse(element) { - t.splitSafeEach(element.childNodes, processElement); - } - function brAtEdgeOfSelection(container, offset) { - return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length && - container.childNodes[offset].tagName === 'BR'; - } - selectedBlocks = sel.getSelectedBlocks(); - if (selectedBlocks.length === 0) { - selectedBlocks = [ dom.getRoot() ]; - } - - r = sel.getRng(true); - if (!r.collapsed) { - if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) { - r.setEnd(r.endContainer, r.endOffset - 1); - sel.setRng(r); - } - if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) { - r.setStart(r.startContainer, r.startOffset + 1); - sel.setRng(r); - } - } - bookmark = sel.getBookmark(); - actions.OL = actions.UL = recurse; - t.splitSafeEach(selectedBlocks, processElement); - sel.moveToBookmark(bookmark); - bookmark = null; - // Avoids table or image handles being left behind in Firefox. - t.ed.execCommand('mceRepaint'); - }, - - splitSafeEach: function(elements, f) { - if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) || - /Firefox\/3\.[0-4]/.test(navigator.userAgent))) { - this.classBasedEach(elements, f); - } else { - each(elements, f); - } - }, - - classBasedEach: function(elements, f) { - var dom = this.ed.dom, nodes, element; - // Mark nodes - each(elements, function(element) { - dom.addClass(element, '_mce_act_on'); - }); - nodes = dom.select('._mce_act_on'); - while (nodes.length > 0) { - element = nodes.shift(); - dom.removeClass(element, '_mce_act_on'); - f(element); - nodes = dom.select('._mce_act_on'); - } - }, - - adjustPaddingFunction: function(isIndent) { - var indentAmount, indentUnits, ed = this.ed; - indentAmount = ed.settings.indentation; - indentUnits = /[a-z%]+/i.exec(indentAmount); - indentAmount = parseInt(indentAmount, 10); - return function(element) { - var currentIndent, newIndentAmount; - currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10); - if (isIndent) { - newIndentAmount = currentIndent + indentAmount; - } else { - newIndentAmount = currentIndent - indentAmount; - } - ed.dom.setStyle(element, 'padding-left', ''); - ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : ''); - }; - }, - - getInfo: function() { - return { - longname : 'Lists', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - tinymce.PluginManager.add("lists", tinymce.plugins.Lists); -}()); diff --git a/plugins/TinyMCE/js/plugins/media/css/media.css b/plugins/TinyMCE/js/plugins/media/css/media.css deleted file mode 100644 index 0c45c7ff6d..0000000000 --- a/plugins/TinyMCE/js/plugins/media/css/media.css +++ /dev/null @@ -1,17 +0,0 @@ -#id, #name, #hspace, #vspace, #class_name, #align { width: 100px } -#hspace, #vspace { width: 50px } -#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px } -#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px } -#width, #height { width: 40px } -#src, #media_type { width: 250px } -#class { width: 120px } -#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto } -.panel_wrapper div.current { height: 420px; overflow: auto } -#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none } -.mceAddSelectValue { background-color: #DDDDDD } -#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px } -#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px } -#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px } -#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px } -#qt_qtsrc { width: 200px } -iframe {border: 1px solid gray} diff --git a/plugins/TinyMCE/js/plugins/media/editor_plugin.js b/plugins/TinyMCE/js/plugins/media/editor_plugin.js deleted file mode 100644 index edba2aff08..0000000000 --- a/plugins/TinyMCE/js/plugins/media/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=x.attr("data-mce-json");if(!D){return}D=g.parse(D);p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ ?/g,"")}if(G&&G.length>0){v.attr(i,G)}});for(F in D.params){v.attr(F,D.params[F])}v.attr({style:z,src:D.params.src});x.replace(v);return}if(this.editor.settings.media_use_script){v=new b("script",1).attr("type","text/javascript");w=new b("#text",3);w.value="write"+p.name+"("+g.serialize(tinymce.extend(D.params,{width:x.attr("width"),height:x.attr("height")}))+");";v.append(w);x.replace(v);return}if(p.name==="Video"&&D.video.sources[0]){A=new b("video",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},D.video.attrs));if(D.video.attrs){l=D.video.attrs.poster}k=D.video.sources=c(D.video.sources);for(y=0;y 0) - flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value); - }); - - if (flashVarsOutput.length) - data.params.flashvars = flashVarsOutput; - - params = editor.getParam('flash_video_player_params', { - allowfullscreen: true, - allowscriptaccess: true - }); - - tinymce.each(params, function(value, name) { - data.params[name] = "" + value; - }); - } - }; - - data = node.attr('data-mce-json'); - if (!data) - return; - - data = JSON.parse(data); - typeItem = this.getType(node.attr('class')); - - style = node.attr('data-mce-style') - if (!style) { - style = node.attr('style'); - - if (style) - style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img')); - } - - // Handle iframe - if (typeItem.name === 'Iframe') { - replacement = new Node('iframe', 1); - - tinymce.each(rootAttributes, function(name) { - var value = node.attr(name); - - if (name == 'class' && value) - value = value.replace(/mceItem.+ ?/g, ''); - - if (value && value.length > 0) - replacement.attr(name, value); - }); - - for (name in data.params) - replacement.attr(name, data.params[name]); - - replacement.attr({ - style: style, - src: data.params.src - }); - - node.replace(replacement); - - return; - } - - // Handle scripts - if (this.editor.settings.media_use_script) { - replacement = new Node('script', 1).attr('type', 'text/javascript'); - - value = new Node('#text', 3); - value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, { - width: node.attr('width'), - height: node.attr('height') - })) + ');'; - - replacement.append(value); - node.replace(replacement); - - return; - } - - // Add HTML5 video element - if (typeItem.name === 'Video' && data.video.sources[0]) { - // Create new object element - video = new Node('video', 1).attr(tinymce.extend({ - id : node.attr('id'), - width: node.attr('width'), - height: node.attr('height'), - style : style - }, data.video.attrs)); - - // Get poster source and use that for flash fallback - if (data.video.attrs) - posterSrc = data.video.attrs.poster; - - sources = data.video.sources = toArray(data.video.sources); - for (i = 0; i < sources.length; i++) { - if (/\.mp4$/.test(sources[i].src)) - mp4Source = sources[i].src; - } - - if (!sources[0].type) { - video.attr('src', sources[0].src); - sources.splice(0, 1); - } - - for (i = 0; i < sources.length; i++) { - source = new Node('source', 1).attr(sources[i]); - source.shortEnded = true; - video.append(source); - } - - // Create flash fallback for video if we have a mp4 source - if (mp4Source) { - addPlayer(mp4Source, posterSrc); - typeItem = self.getType('flash'); - } else - data.params.src = ''; - } - - // Do we have a params src then we can generate object - if (data.params.src) { - // Is flv movie add player for it - if (/\.flv$/i.test(data.params.src)) - addPlayer(data.params.src, ''); - - if (args && args.force_absolute) - data.params.src = editor.documentBaseURI.toAbsolute(data.params.src); - - // Create new object element - object = new Node('object', 1).attr({ - id : node.attr('id'), - width: node.attr('width'), - height: node.attr('height'), - style : style - }); - - tinymce.each(rootAttributes, function(name) { - if (data[name] && name != 'type') - object.attr(name, data[name]); - }); - - // Add params - for (name in data.params) { - param = new Node('param', 1); - param.shortEnded = true; - value = data.params[name]; - - // Windows media needs to use url instead of src for the media URL - if (name === 'src' && typeItem.name === 'WindowsMedia') - name = 'url'; - - param.attr({name: name, value: value}); - object.append(param); - } - - // Setup add type and classid if strict is disabled - if (this.editor.getParam('media_strict', true)) { - object.attr({ - data: data.params.src, - type: typeItem.mimes[0] - }); - } else { - object.attr({ - classid: "clsid:" + typeItem.clsids[0], - codebase: typeItem.codebase - }); - - embed = new Node('embed', 1); - embed.shortEnded = true; - embed.attr({ - id: node.attr('id'), - width: node.attr('width'), - height: node.attr('height'), - style : style, - type: typeItem.mimes[0] - }); - - for (name in data.params) - embed.attr(name, data.params[name]); - - tinymce.each(rootAttributes, function(name) { - if (data[name] && name != 'type') - embed.attr(name, data[name]); - }); - - object.append(embed); - } - - // Insert raw HTML - if (data.object_html) { - value = new Node('#text', 3); - value.raw = true; - value.value = data.object_html; - object.append(value); - } - - // Append object to video element if it exists - if (video) - video.append(object); - } - - if (video) { - // Insert raw HTML - if (data.video_html) { - value = new Node('#text', 3); - value.raw = true; - value.value = data.video_html; - video.append(value); - } - } - - if (video || object) - node.replace(video || object); - else - node.remove(); - }, - - /** - * Converts a tinymce.html.Node video/object/embed to an img element. - * - * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this: - * - * - * The JSON structure will be like this: - * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}} - */ - objectToImg : function(node) { - var object, embed, video, iframe, img, name, id, width, height, style, i, html, - param, params, source, sources, data, type, lookup = this.lookup, - matches, attrs, urlConverter = this.editor.settings.url_converter, - urlConverterScope = this.editor.settings.url_converter_scope; - - function getInnerHTML(node) { - return new tinymce.html.Serializer({ - inner: true, - validate: false - }).serialize(node); - }; - - // If node isn't in document - if (!node.parent) - return; - - // Handle media scripts - if (node.name === 'script') { - if (node.firstChild) - matches = scriptRegExp.exec(node.firstChild.value); - - if (!matches) - return; - - type = matches[1]; - data = {video : {}, params : JSON.parse(matches[2])}; - width = data.params.width; - height = data.params.height; - } - - // Setup data objects - data = data || { - video : {}, - params : {} - }; - - // Setup new image object - img = new Node('img', 1); - img.attr({ - src : this.editor.theme.url + '/img/trans.gif' - }); - - // Video element - name = node.name; - if (name === 'video') { - video = node; - object = node.getAll('object')[0]; - embed = node.getAll('embed')[0]; - width = video.attr('width'); - height = video.attr('height'); - id = video.attr('id'); - data.video = {attrs : {}, sources : []}; - - // Get all video attributes - attrs = data.video.attrs; - for (name in video.attributes.map) - attrs[name] = video.attributes.map[name]; - - source = node.attr('src'); - if (source) - data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', 'video')}); - - // Get all sources - sources = video.getAll("source"); - for (i = 0; i < sources.length; i++) { - source = sources[i].remove(); - - data.video.sources.push({ - src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'), - type: source.attr('type'), - media: source.attr('media') - }); - } - - // Convert the poster URL - if (attrs.poster) - attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', 'video'); - } - - // Object element - if (node.name === 'object') { - object = node; - embed = node.getAll('embed')[0]; - } - - // Embed element - if (node.name === 'embed') - embed = node; - - // Iframe element - if (node.name === 'iframe') { - iframe = node; - type = 'Iframe'; - } - - if (object) { - // Get width/height - width = width || object.attr('width'); - height = height || object.attr('height'); - style = style || object.attr('style'); - id = id || object.attr('id'); - - // Get all object params - params = object.getAll("param"); - for (i = 0; i < params.length; i++) { - param = params[i]; - name = param.remove().attr('name'); - - if (!excludedAttrs[name]) - data.params[name] = param.attr('value'); - } - - data.params.src = data.params.src || object.attr('data'); - } - - if (embed) { - // Get width/height - width = width || embed.attr('width'); - height = height || embed.attr('height'); - style = style || embed.attr('style'); - id = id || embed.attr('id'); - - // Get all embed attributes - for (name in embed.attributes.map) { - if (!excludedAttrs[name] && !data.params[name]) - data.params[name] = embed.attributes.map[name]; - } - } - - if (iframe) { - // Get width/height - width = iframe.attr('width'); - height = iframe.attr('height'); - style = style || iframe.attr('style'); - id = iframe.attr('id'); - - tinymce.each(rootAttributes, function(name) { - img.attr(name, iframe.attr(name)); - }); - - // Get all iframe attributes - for (name in iframe.attributes.map) { - if (!excludedAttrs[name] && !data.params[name]) - data.params[name] = iframe.attributes.map[name]; - } - } - - // Use src not movie - if (data.params.movie) { - data.params.src = data.params.src || data.params.movie; - delete data.params.movie; - } - - // Convert the URL to relative/absolute depending on configuration - if (data.params.src) - data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); - - if (video) - type = lookup.video.name; - - if (object && !type) - type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name; - - if (embed && !type) - type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name; - - // Replace the video/object/embed element with a placeholder image containing the data - node.replace(img); - - // Remove embed - if (embed) - embed.remove(); - - // Serialize the inner HTML of the object element - if (object) { - html = getInnerHTML(object.remove()); - - if (html) - data.object_html = html; - } - - // Serialize the inner HTML of the video element - if (video) { - html = getInnerHTML(video.remove()); - - if (html) - data.video_html = html; - } - - // Set width/height of placeholder - img.attr({ - id : id, - 'class' : 'mceItemMedia mceItem' + (type || 'Flash'), - style : style, - width : width || "320", - height : height || "240", - "data-mce-json" : JSON.serialize(data, "'") - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/media/js/embed.js b/plugins/TinyMCE/js/plugins/media/js/embed.js deleted file mode 100644 index f8dc810527..0000000000 --- a/plugins/TinyMCE/js/plugins/media/js/embed.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. - */ - -function writeFlash(p) { - writeEmbed( - 'D27CDB6E-AE6D-11cf-96B8-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'application/x-shockwave-flash', - p - ); -} - -function writeShockWave(p) { - writeEmbed( - '166B1BCA-3F9C-11CF-8075-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', - 'application/x-director', - p - ); -} - -function writeQuickTime(p) { - writeEmbed( - '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', - 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', - 'video/quicktime', - p - ); -} - -function writeRealMedia(p) { - writeEmbed( - 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'audio/x-pn-realaudio-plugin', - p - ); -} - -function writeWindowsMedia(p) { - p.url = p.src; - writeEmbed( - '6BF52A52-394A-11D3-B153-00C04F79FAA6', - 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', - 'application/x-mplayer2', - p - ); -} - -function writeEmbed(cls, cb, mt, p) { - var h = '', n; - - h += ''; - - h += ''); - - function get(id) { - return document.getElementById(id); - } - - function getVal(id) { - var elm = get(id); - - if (elm.nodeName == "SELECT") - return elm.options[elm.selectedIndex].value; - - if (elm.type == "checkbox") - return elm.checked; - - return elm.value; - } - - function setVal(id, value, name) { - if (typeof(value) != 'undefined') { - var elm = get(id); - - if (elm.nodeName == "SELECT") - selectByValue(document.forms[0], id, value); - else if (elm.type == "checkbox") { - if (typeof(value) == 'string') { - value = value.toLowerCase(); - value = (!name && value === 'true') || (name && value === name.toLowerCase()); - } - elm.checked = !!value; - } else - elm.value = value; - } - } - - window.Media = { - init : function() { - var html, editor; - - this.editor = editor = tinyMCEPopup.editor; - - // Setup file browsers and color pickers - get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); - get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); - get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media'); - get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media'); - get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); - - html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); - if (html == "") - get("linklistrow").style.display = 'none'; - else - get("linklistcontainer").innerHTML = html; - - if (isVisible('filebrowser')) - get('src').style.width = '230px'; - - if (isVisible('filebrowser_altsource1')) - get('video_altsource1').style.width = '220px'; - - if (isVisible('filebrowser_altsource2')) - get('video_altsource2').style.width = '220px'; - - if (isVisible('filebrowser_poster')) - get('video_poster').style.width = '220px'; - - this.data = tinyMCEPopup.getWindowArg('data'); - this.dataToForm(); - this.preview(); - }, - - insert : function() { - var editor = tinyMCEPopup.editor; - - this.formToData(); - editor.execCommand('mceRepaint'); - tinyMCEPopup.restoreSelection(); - editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); - tinyMCEPopup.close(); - }, - - preview : function() { - get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); - }, - - moveStates : function(to_form, field) { - var data = this.data, editor = this.editor, data = this.data, - mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; - - defaultStates = { - // QuickTime - quicktime_autoplay : true, - quicktime_controller : true, - - // Flash - flash_play : true, - flash_loop : true, - flash_menu : true, - - // WindowsMedia - windowsmedia_autostart : true, - windowsmedia_enablecontextmenu : true, - windowsmedia_invokeurls : true, - - // RealMedia - realmedia_autogotourl : true, - realmedia_imagestatus : true - }; - - function parseQueryParams(str) { - var out = {}; - - if (str) { - tinymce.each(str.split('&'), function(item) { - var parts = item.split('='); - - out[unescape(parts[0])] = unescape(parts[1]); - }); - } - - return out; - }; - - function setOptions(type, names) { - var i, name, formItemName, value, list; - - if (type == data.type || type == 'global') { - names = tinymce.explode(names); - for (i = 0; i < names.length; i++) { - name = names[i]; - formItemName = type == 'global' ? name : type + '_' + name; - - if (type == 'global') - list = data; - else if (type == 'video') { - list = data.video.attrs; - - if (!list && !to_form) - data.video.attrs = list = {}; - } else - list = data.params; - - if (list) { - if (to_form) { - setVal(formItemName, list[name], type == 'video' ? name : ''); - } else { - delete list[name]; - - value = getVal(formItemName); - if (type == 'video' && value === true) - value = name; - - if (defaultStates[formItemName]) { - if (value !== defaultStates[formItemName]) { - value = "" + value; - list[name] = value; - } - } else if (value) { - value = "" + value; - list[name] = value; - } - } - } - } - } - } - - if (!to_form) { - data.type = get('media_type').options[get('media_type').selectedIndex].value; - data.width = getVal('width'); - data.height = getVal('height'); - - // Switch type based on extension - src = getVal('src'); - if (field == 'src') { - ext = src.replace(/^.*\.([^.]+)$/, '$1'); - if (typeInfo = mediaPlugin.getType(ext)) - data.type = typeInfo.name.toLowerCase(); - - setVal('media_type', data.type); - } - - if (data.type == "video") { - if (!data.video.sources) - data.video.sources = []; - - data.video.sources[0] = {src: getVal('src')}; - } - } - - // Hide all fieldsets and show the one active - get('video_options').style.display = 'none'; - get('flash_options').style.display = 'none'; - get('quicktime_options').style.display = 'none'; - get('shockwave_options').style.display = 'none'; - get('windowsmedia_options').style.display = 'none'; - get('realmedia_options').style.display = 'none'; - - if (get(data.type + '_options')) - get(data.type + '_options').style.display = 'block'; - - setVal('media_type', data.type); - - setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); - setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); - setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); - setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); - setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); - setOptions('video', 'poster,autoplay,loop,preload,controls'); - setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); - - if (to_form) { - if (data.type == 'video') { - if (data.video.sources[0]) - setVal('src', data.video.sources[0].src); - - src = data.video.sources[1]; - if (src) - setVal('video_altsource1', src.src); - - src = data.video.sources[2]; - if (src) - setVal('video_altsource2', src.src); - } else { - // Check flash vars - if (data.type == 'flash') { - tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { - if (value == '$url') - data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; - }); - } - - setVal('src', data.params.src); - } - } else { - src = getVal("src"); - - // YouTube - if (src.match(/youtube.com(.+)v=([^&]+)/)) { - data.width = 425; - data.height = 350; - data.params.frameborder = '0'; - data.type = 'iframe'; - src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; - setVal('src', src); - setVal('media_type', data.type); - } - - // Google video - if (src.match(/video.google.com(.+)docid=([^&]+)/)) { - data.width = 425; - data.height = 326; - data.type = 'flash'; - src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; - setVal('src', src); - setVal('media_type', data.type); - } - - if (data.type == 'video') { - if (!data.video.sources) - data.video.sources = []; - - data.video.sources[0] = {src : src}; - - src = getVal("video_altsource1"); - if (src) - data.video.sources[1] = {src : src}; - - src = getVal("video_altsource2"); - if (src) - data.video.sources[2] = {src : src}; - } else - data.params.src = src; - - // Set default size - setVal('width', data.width || 320); - setVal('height', data.height || 240); - } - }, - - dataToForm : function() { - this.moveStates(true); - }, - - formToData : function(field) { - if (field == "width" || field == "height") - this.changeSize(field); - - if (field == 'source') { - this.moveStates(false, field); - setVal('source', this.editor.plugins.media.dataToHtml(this.data)); - this.panel = 'source'; - } else { - if (this.panel == 'source') { - this.data = this.editor.plugins.media.htmlToData(getVal('source')); - this.dataToForm(); - this.panel = ''; - } - - this.moveStates(false, field); - this.preview(); - } - }, - - beforeResize : function() { - this.width = parseInt(getVal('width') || "320", 10); - this.height = parseInt(getVal('height') || "240", 10); - }, - - changeSize : function(type) { - var width, height, scale, size; - - if (get('constrain').checked) { - width = parseInt(getVal('width') || "320", 10); - height = parseInt(getVal('height') || "240", 10); - - if (type == 'width') { - this.height = Math.round((width / this.width) * height); - setVal('height', this.height); - } else { - this.width = Math.round((height / this.height) * width); - setVal('width', this.width); - } - } - }, - - getMediaListHTML : function() { - if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { - var html = ""; - - html += ''; - - return html; - } - - return ""; - } - }; - - tinyMCEPopup.requireLangPack(); - tinyMCEPopup.onInit.add(function() { - Media.init(); - }); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/media/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/media/langs/en_dlg.js deleted file mode 100644 index 29d26a0d41..0000000000 --- a/plugins/TinyMCE/js/plugins/media/langs/en_dlg.js +++ /dev/null @@ -1,109 +0,0 @@ -tinyMCE.addI18n('en.media_dlg',{ -title:"Insert / edit embedded media", -general:"General", -advanced:"Advanced", -file:"File/URL", -list:"List", -size:"Dimensions", -preview:"Preview", -constrain_proportions:"Constrain proportions", -type:"Type", -id:"Id", -name:"Name", -class_name:"Class", -vspace:"V-Space", -hspace:"H-Space", -play:"Auto play", -loop:"Loop", -menu:"Show menu", -quality:"Quality", -scale:"Scale", -align:"Align", -salign:"SAlign", -wmode:"WMode", -bgcolor:"Background", -base:"Base", -flashvars:"Flashvars", -liveconnect:"SWLiveConnect", -autohref:"AutoHREF", -cache:"Cache", -hidden:"Hidden", -controller:"Controller", -kioskmode:"Kiosk mode", -playeveryframe:"Play every frame", -targetcache:"Target cache", -correction:"No correction", -enablejavascript:"Enable JavaScript", -starttime:"Start time", -endtime:"End time", -href:"Href", -qtsrcchokespeed:"Choke speed", -target:"Target", -volume:"Volume", -autostart:"Auto start", -enabled:"Enabled", -fullscreen:"Fullscreen", -invokeurls:"Invoke URLs", -mute:"Mute", -stretchtofit:"Stretch to fit", -windowlessvideo:"Windowless video", -balance:"Balance", -baseurl:"Base URL", -captioningid:"Captioning id", -currentmarker:"Current marker", -currentposition:"Current position", -defaultframe:"Default frame", -playcount:"Play count", -rate:"Rate", -uimode:"UI Mode", -flash_options:"Flash options", -qt_options:"Quicktime options", -wmp_options:"Windows media player options", -rmp_options:"Real media player options", -shockwave_options:"Shockwave options", -autogotourl:"Auto goto URL", -center:"Center", -imagestatus:"Image status", -maintainaspect:"Maintain aspect", -nojava:"No java", -prefetch:"Prefetch", -shuffle:"Shuffle", -console:"Console", -numloop:"Num loops", -controls:"Controls", -scriptcallbacks:"Script callbacks", -swstretchstyle:"Stretch style", -swstretchhalign:"Stretch H-Align", -swstretchvalign:"Stretch V-Align", -sound:"Sound", -progress:"Progress", -qtsrc:"QT Src", -qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..", -align_top:"Top", -align_right:"Right", -align_bottom:"Bottom", -align_left:"Left", -align_center:"Center", -align_top_left:"Top left", -align_top_right:"Top right", -align_bottom_left:"Bottom left", -align_bottom_right:"Bottom right", -flv_options:"Flash video options", -flv_scalemode:"Scale mode", -flv_buffer:"Buffer", -flv_starttime:"Start time", -flv_defaultvolume:"Default volumne", -flv_hiddengui:"Hidden GUI", -flv_autostart:"Auto start", -flv_loop:"Loop", -flv_showscalemodes:"Show scale modes", -flv_smoothvideo:"Smooth video", -flv_jscallback:"JS Callback", -html5_video_options:"HTML5 Video Options", -altsource1:"Alternative source 1", -altsource2:"Alternative source 2", -preload:"Preload", -poster:"Poster", - -source:"Source" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/media/media.htm b/plugins/TinyMCE/js/plugins/media/media.htm deleted file mode 100644 index 807a537dc4..0000000000 --- a/plugins/TinyMCE/js/plugins/media/media.htm +++ /dev/null @@ -1,812 +0,0 @@ - - - - {#media_dlg.title} - - - - - - - - - -
    - - -
    -
    -
    - {#media_dlg.general} - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - -
     
    -
    - - - - - - -
    x   
    -
    -
    - -
    - {#media_dlg.preview} - -
    -
    - -
    -
    - {#media_dlg.advanced} - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - -
     
    -
    -
    - -
    - {#media_dlg.html5_video_options} - - - - - - - - - - - - - - - - -
    - - - - - -
     
    -
    - - - - - -
     
    -
    - - - - - -
     
    -
    - - - - - - - - - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    -
    - -
    - {#media_dlg.flash_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - - - - - - - -
    -
    - -
    - {#media_dlg.qt_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    -  
    - - - - - -
     
    -
    -
    - -
    - {#media_dlg.wmp_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    -
    - -
    - {#media_dlg.rmp_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    -   -
    -
    - -
    - {#media_dlg.shockwave_options} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    - - - - - -
    -
    -
    -
    - -
    -
    - {#media_dlg.source} - -
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/media/moxieplayer.swf b/plugins/TinyMCE/js/plugins/media/moxieplayer.swf deleted file mode 100644 index 2a040358df0d1f8eb784d2ec0919626198d6eb47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33931 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 diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js deleted file mode 100644 index 73947355f0..0000000000 --- a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?' ':" ")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js deleted file mode 100644 index b3ea82ee03..0000000000 --- a/plugins/TinyMCE/js/plugins/nonbreaking/editor_plugin_src.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Nonbreaking', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceNonBreaking', function() { - ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); - }); - - // Register buttons - ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'}); - - if (ed.getParam('nonbreaking_force_tab')) { - ed.onKeyDown.add(function(ed, e) { - if (tinymce.isIE && e.keyCode == 9) { - ed.execCommand('mceNonBreaking'); - ed.execCommand('mceNonBreaking'); - ed.execCommand('mceNonBreaking'); - tinymce.dom.Event.cancel(e); - } - }); - } - }, - - getInfo : function() { - return { - longname : 'Nonbreaking space', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - - // Private methods - }); - - // Register plugin - tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js deleted file mode 100644 index cc7de78466..0000000000 --- a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block);b.onContextMenu.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block);b.onContextMenu.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js deleted file mode 100644 index b6cf15430b..0000000000 --- a/plugins/TinyMCE/js/plugins/noneditable/editor_plugin_src.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var Event = tinymce.dom.Event; - - tinymce.create('tinymce.plugins.NonEditablePlugin', { - init : function(ed, url) { - var t = this, editClass, nonEditClass; - - t.editor = ed; - editClass = ed.getParam("noneditable_editable_class", "mceEditable"); - nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable"); - - ed.onNodeChange.addToTop(function(ed, cm, n) { - var sc, ec; - - // Block if start or end is inside a non editable element - sc = ed.dom.getParent(ed.selection.getStart(), function(n) { - return ed.dom.hasClass(n, nonEditClass); - }); - - ec = ed.dom.getParent(ed.selection.getEnd(), function(n) { - return ed.dom.hasClass(n, nonEditClass); - }); - - // Block or unblock - if (sc || ec) { - t._setDisabled(1); - return false; - } else - t._setDisabled(0); - }); - }, - - getInfo : function() { - return { - longname : 'Non editable elements', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _block : function(ed, e) { - var k = e.keyCode; - - // Don't block arrow keys, pg up/down, and F1-F12 - if ((k > 32 && k < 41) || (k > 111 && k < 124)) - return; - - return Event.cancel(e); - }, - - _setDisabled : function(s) { - var t = this, ed = t.editor; - - tinymce.each(ed.controlManager.controls, function(c) { - c.setDisabled(s); - }); - - if (s !== t.disabled) { - if (s) { - ed.onKeyDown.addToTop(t._block); - ed.onKeyPress.addToTop(t._block); - ed.onKeyUp.addToTop(t._block); - ed.onPaste.addToTop(t._block); - ed.onContextMenu.addToTop(t._block); - } else { - ed.onKeyDown.remove(t._block); - ed.onKeyPress.remove(t._block); - ed.onKeyUp.remove(t._block); - ed.onPaste.remove(t._block); - ed.onContextMenu.remove(t._block); - } - - t.disabled = s; - } - } - }); - - // Register plugin - tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js deleted file mode 100644 index 35085e8adc..0000000000 --- a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='',a="mcePageBreak",c=b.getParam("pagebreak_separator",""),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js deleted file mode 100644 index a094c19162..0000000000 --- a/plugins/TinyMCE/js/plugins/pagebreak/editor_plugin_src.js +++ /dev/null @@ -1,74 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.PageBreakPlugin', { - init : function(ed, url) { - var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; - - pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); - - // Register commands - ed.addCommand('mcePageBreak', function() { - ed.execCommand('mceInsertContent', 0, pb); - }); - - // Register buttons - ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); - - ed.onInit.add(function() { - if (ed.theme.onResolveName) { - ed.theme.onResolveName.add(function(th, o) { - if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) - o.name = 'pagebreak'; - }); - } - }); - - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls)) - ed.selection.select(e); - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls)); - }); - - ed.onBeforeSetContent.add(function(ed, o) { - o.content = o.content.replace(pbRE, pb); - }); - - ed.onPostProcess.add(function(ed, o) { - if (o.get) - o.content = o.content.replace(/]+>/g, function(im) { - if (im.indexOf('class="mcePageBreak') !== -1) - im = sep; - - return im; - }); - }); - }, - - getInfo : function() { - return { - longname : 'PageBreak', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/paste/editor_plugin.js b/plugins/TinyMCE/js/plugins/paste/editor_plugin.js deleted file mode 100644 index 22149cc6a3..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(d,k,l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:r.replace(/\r?\n/g,"
    ")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="
    "+o.encode(r).replace(/\r?\n/g,"
    ")+"
    "}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:
     [\s\r\n]+|
    )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
     [\s\r\n]+|
    )*/g,"$1"]]);d([[/

    /g,"

    "],[/
    /g," "],[/

    /g,"
    "],])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/

    ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

    $1

    ")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,"

    "],[/<\/h[1-6][^>]*>/gi,"

    "]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(d){c(d,function(h){if(h.constructor==RegExp){v=v.replace(h,"")}else{v=v.replace(h[0],h[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.decode(tinymce.html.Entities.encodeRaw(v));if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"
    "]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"

    "],[/\n/g,"
    "]])}}if((l=v.indexOf("

    "))!=-1){k=v.lastIndexOf("

    ");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+' ');window.setTimeout(function(){var d=x.get("_plain_text_marker"),A,h,w,i;s.select(d,false);z.execCommand("Delete",false,null);d=null;A=s.getStart();h=x.getViewPort(n);w=x.getPos(A).y;i=A.clientHeight;if((wh.y+h.h)){z.body.scrollTop=w

    ' + dom.encode(textContent).replace(/\r?\n/g, '
    ') + '
    '; - } - - // Remove the nodes - each(dom.select('div.mcePaste'), function(n) { - dom.remove(n); - }); - - // Restore the old selection - if (or) - sel.setRng(or); - - process({content : h}); - - // Unblock events ones we got the contents - dom.unbind(ed.getDoc(), 'mousedown', block); - dom.unbind(ed.getDoc(), 'keydown', block); - }, 0); - } - } - - // Check if we should use the new auto process method - if (getParam(ed, "paste_auto_cleanup_on_paste")) { - // Is it's Opera or older FF use key handler - if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { - ed.onKeyDown.addToTop(function(ed, e) { - if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) - grabContent(e); - }); - } else { - // Grab contents on paste event on Gecko and WebKit - ed.onPaste.addToTop(function(ed, e) { - return grabContent(e); - }); - } - } - - ed.onInit.add(function() { - ed.controlManager.setActive("pastetext", ed.pasteAsPlainText); - - // Block all drag/drop events - if (getParam(ed, "paste_block_drop")) { - ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { - e.preventDefault(); - e.stopPropagation(); - - return false; - }); - } - }); - - // Add legacy support - t._legacySupport(); - }, - - getInfo : function() { - return { - longname : 'Paste text/word', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - _preProcess : function(pl, o) { - var ed = this.editor, - h = o.content, - grep = tinymce.grep, - explode = tinymce.explode, - trim = tinymce.trim, - len, stripClass; - - //console.log('Before preprocess:' + o.content); - - function process(items) { - each(items, function(v) { - // Remove or replace - if (v.constructor == RegExp) - h = h.replace(v, ''); - else - h = h.replace(v[0], v[1]); - }); - } - - if (ed.settings.paste_enable_default_filters == false) { - return; - } - - // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser - if (tinymce.isIE && document.documentMode >= 9) { - // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser - process([[/(?:
     [\s\r\n]+|
    )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
     [\s\r\n]+|
    )*/g, '$1']]); - - // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break - process([ - [/

    /g, '

    '], // Replace multiple BR elements with uppercase BR to keep them intact - [/
    /g, ' '], // Replace single br elements with space since they are word wrap BR:s - [/

    /g, '
    '], // Replace back the double brs but into a single BR - ]); - } - - // Detect Word content and process it more aggressive - if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { - o.wordContent = true; // Mark the pasted contents as word specific content - //console.log('Word contents detected.'); - - // Process away some basic content - process([ - /^\s*( )+/gi, //   entities at the start of contents - /( |]*>)+\s*$/gi //   entities at the end of contents - ]); - - if (getParam(ed, "paste_convert_headers_to_strong")) { - h = h.replace(/

    ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

    $1

    "); - } - - if (getParam(ed, "paste_convert_middot_lists")) { - process([ - [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker - [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers - [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF) - ]); - } - - process([ - // Word comments like conditional comments etc - //gi, - - // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags - /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, - - // Convert into for line-though - [/<(\/?)s>/gi, "<$1strike>"], - - // Replace nsbp entites to char since it's easier to handle - [/ /gi, "\u00a0"] - ]); - - // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. - // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. - do { - len = h.length; - h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); - } while (len != h.length); - - // Remove all spans if no styles is to be retained - if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { - h = h.replace(/<\/?span[^>]*>/gi, ""); - } else { - // We're keeping styles, so at least clean them up. - // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx - - process([ - // Convert ___ to string of alternating breaking/non-breaking spaces of same length - [/([\s\u00a0]*)<\/span>/gi, - function(str, spaces) { - return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; - } - ], - - // Examine all styles: delete junk, transform some, and keep the rest - [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, - function(str, tag, style) { - var n = [], - i = 0, - s = explode(trim(style).replace(/"/gi, "'"), ";"); - - // Examine each style definition within the tag's style attribute - each(s, function(v) { - var name, value, - parts = explode(v, ":"); - - function ensureUnits(v) { - return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; - } - - if (parts.length == 2) { - name = parts[0].toLowerCase(); - value = parts[1].toLowerCase(); - - // Translate certain MS Office styles into their CSS equivalents - switch (name) { - case "mso-padding-alt": - case "mso-padding-top-alt": - case "mso-padding-right-alt": - case "mso-padding-bottom-alt": - case "mso-padding-left-alt": - case "mso-margin-alt": - case "mso-margin-top-alt": - case "mso-margin-right-alt": - case "mso-margin-bottom-alt": - case "mso-margin-left-alt": - case "mso-table-layout-alt": - case "mso-height": - case "mso-width": - case "mso-vertical-align-alt": - n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); - return; - - case "horiz-align": - n[i++] = "text-align:" + value; - return; - - case "vert-align": - n[i++] = "vertical-align:" + value; - return; - - case "font-color": - case "mso-foreground": - n[i++] = "color:" + value; - return; - - case "mso-background": - case "mso-highlight": - n[i++] = "background:" + value; - return; - - case "mso-default-height": - n[i++] = "min-height:" + ensureUnits(value); - return; - - case "mso-default-width": - n[i++] = "min-width:" + ensureUnits(value); - return; - - case "mso-padding-between-alt": - n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); - return; - - case "text-line-through": - if ((value == "single") || (value == "double")) { - n[i++] = "text-decoration:line-through"; - } - return; - - case "mso-zero-height": - if (value == "yes") { - n[i++] = "display:none"; - } - return; - } - - // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name - if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) { - return; - } - - // If it reached this point, it must be a valid CSS style - n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case - } - }); - - // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. - if (i > 0) { - return tag + ' style="' + n.join(';') + '"'; - } else { - return tag; - } - } - ] - ]); - } - } - - // Replace headers with - if (getParam(ed, "paste_convert_headers_to_strong")) { - process([ - [/]*>/gi, "

    "], - [/<\/h[1-6][^>]*>/gi, "

    "] - ]); - } - - process([ - // Copy paste from Java like Open Office will produce this junk on FF - [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ''] - ]); - - // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). - // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. - stripClass = getParam(ed, "paste_strip_class_attributes"); - - if (stripClass !== "none") { - function removeClasses(match, g1) { - if (stripClass === "all") - return ''; - - var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), - function(v) { - return (/^(?!mso)/i.test(v)); - } - ); - - return cls.length ? ' class="' + cls.join(" ") + '"' : ''; - }; - - h = h.replace(/ class="([^"]+)"/gi, removeClasses); - h = h.replace(/ class=([\-\w]+)/gi, removeClasses); - } - - // Remove spans option - if (getParam(ed, "paste_remove_spans")) { - h = h.replace(/<\/?span[^>]*>/gi, ""); - } - - //console.log('After preprocess:' + h); - - o.content = h; - }, - - /** - * Various post process items. - */ - _postProcess : function(pl, o) { - var t = this, ed = t.editor, dom = ed.dom, styleProps; - - if (ed.settings.paste_enable_default_filters == false) { - return; - } - - if (o.wordContent) { - // Remove named anchors or TOC links - each(dom.select('a', o.node), function(a) { - if (!a.href || a.href.indexOf('#_Toc') != -1) - dom.remove(a, 1); - }); - - if (getParam(ed, "paste_convert_middot_lists")) { - t._convertLists(pl, o); - } - - // Process styles - styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties - - // Process only if a string was specified and not equal to "all" or "*" - if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { - styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); - - // Retains some style properties - each(dom.select('*', o.node), function(el) { - var newStyle = {}, npc = 0, i, sp, sv; - - // Store a subset of the existing styles - if (styleProps) { - for (i = 0; i < styleProps.length; i++) { - sp = styleProps[i]; - sv = dom.getStyle(el, sp); - - if (sv) { - newStyle[sp] = sv; - npc++; - } - } - } - - // Remove all of the existing styles - dom.setAttrib(el, 'style', ''); - - if (styleProps && npc > 0) - dom.setStyles(el, newStyle); // Add back the stored subset of styles - else // Remove empty span tags that do not have class attributes - if (el.nodeName == 'SPAN' && !el.className) - dom.remove(el, true); - }); - } - } - - // Remove all style information or only specifically on WebKit to avoid the style bug on that browser - if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { - each(dom.select('*[style]', o.node), function(el) { - el.removeAttribute('style'); - el.removeAttribute('data-mce-style'); - }); - } else { - if (tinymce.isWebKit) { - // We need to compress the styles on WebKit since if you paste it will become - // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles - each(dom.select('*', o.node), function(el) { - el.removeAttribute('data-mce-style'); - }); - } - } - }, - - /** - * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. - */ - _convertLists : function(pl, o) { - var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; - - // Convert middot lists into real semantic lists - each(dom.select('p', o.node), function(p) { - var sib, val = '', type, html, idx, parents; - - // Get text node value at beginning of paragraph - for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) - val += sib.nodeValue; - - val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0'); - - // Detect unordered lists look for bullets - if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val)) - type = 'ul'; - - // Detect ordered lists 1., a. or ixv. - if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val)) - type = 'ol'; - - // Check if node value matches the list pattern: o   - if (type) { - margin = parseFloat(p.style.marginLeft || 0); - - if (margin > lastMargin) - levels.push(margin); - - if (!listElm || type != lastType) { - listElm = dom.create(type); - dom.insertAfter(listElm, p); - } else { - // Nested list element - if (margin > lastMargin) { - listElm = li.appendChild(dom.create(type)); - } else if (margin < lastMargin) { - // Find parent level based on margin value - idx = tinymce.inArray(levels, margin); - parents = dom.getParents(listElm.parentNode, type); - listElm = parents[parents.length - 1 - idx] || listElm; - } - } - - // Remove middot or number spans if they exists - each(dom.select('span', p), function(span) { - var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); - - // Remove span with the middot or the number - if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html)) - dom.remove(span); - else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) - dom.remove(span); - }); - - html = p.innerHTML; - - // Remove middot/list items - if (type == 'ul') - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, ''); - else - html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); - - // Create li and add paragraph data into the new li - li = listElm.appendChild(dom.create('li', 0, html)); - dom.remove(p); - - lastMargin = margin; - lastType = type; - } else - listElm = lastMargin = 0; // End list element - }); - - // Remove any left over makers - html = o.node.innerHTML; - if (html.indexOf('__MCE_ITEM__') != -1) - o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); - }, - - /** - * Inserts the specified contents at the caret position. - */ - _insert : function(h, skip_undo) { - var ed = this.editor, r = ed.selection.getRng(); - - // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. - if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) - ed.getDoc().execCommand('Delete', false, null); - - ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo}); - }, - - /** - * Instead of the old plain text method which tried to re-create a paste operation, the - * new approach adds a plain text mode toggle switch that changes the behavior of paste. - * This function is passed the same input that the regular paste plugin produces. - * It performs additional scrubbing and produces (and inserts) the plain text. - * This approach leverages all of the great existing functionality in the paste - * plugin, and requires minimal changes to add the new functionality. - * Speednet - June 2009 - */ - _insertPlainText : function(ed, dom, h) { - var i, len, pos, rpos, node, breakElms, before, after, - w = ed.getWin(), - d = ed.getDoc(), - sel = ed.selection, - is = tinymce.is, - inArray = tinymce.inArray, - linebr = getParam(ed, "paste_text_linebreaktype"), - rl = getParam(ed, "paste_text_replacements"); - - function process(items) { - each(items, function(v) { - if (v.constructor == RegExp) - h = h.replace(v, ""); - else - h = h.replace(v[0], v[1]); - }); - }; - - if ((typeof(h) === "string") && (h.length > 0)) { - // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line - if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { - process([ - /[\n\r]+/g - ]); - } else { - // Otherwise just get rid of carriage returns (only need linefeeds) - process([ - /\r+/g - ]); - } - - process([ - [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them - [/]*>|<\/tr>/gi, "\n"], // Single linebreak for
    tags and table rows - [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them - /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags - [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) - [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. - [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks - /^\s+|\s+$/g // Trim the front & back - ]); - - h = dom.decode(tinymce.html.Entities.encodeRaw(h)); - - // Delete any highlighted text before pasting - if (!sel.isCollapsed()) { - d.execCommand("Delete", false, null); - } - - // Perform default or custom replacements - if (is(rl, "array") || (is(rl, "array"))) { - process(rl); - } - else if (is(rl, "string")) { - process(new RegExp(rl, "gi")); - } - - // Treat paragraphs as specified in the config - if (linebr == "none") { - process([ - [/\n+/g, " "] - ]); - } - else if (linebr == "br") { - process([ - [/\n/g, "
    "] - ]); - } - else { - process([ - /^\s+|\s+$/g, - [/\n\n/g, "

    "], - [/\n/g, "
    "] - ]); - } - - // This next piece of code handles the situation where we're pasting more than one paragraph of plain - // text, and we are pasting the content into the middle of a block node in the editor. The block - // node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining). - // The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the - // pasted text is prepended to "Para B". Any other paragraphs of pasted text are placed between - // "Para A" and "Para B". This code solves a host of problems with the original plain text plugin and - // now handles styles correctly. (Pasting plain text into a styled paragraph is supposed to make the - // plain text take the same style as the existing paragraph.) - if ((pos = h.indexOf("

    ")) != -1) { - rpos = h.lastIndexOf("

    "); - node = sel.getNode(); - breakElms = []; // Get list of elements to break - - do { - if (node.nodeType == 1) { - // Don't break tables and break at body - if (node.nodeName == "TD" || node.nodeName == "BODY") { - break; - } - - breakElms[breakElms.length] = node; - } - } while (node = node.parentNode); - - // Are we in the middle of a block node? - if (breakElms.length > 0) { - before = h.substring(0, pos); - after = ""; - - for (i=0, len=breakElms.length; i"; - after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">"; - } - - if (pos == rpos) { - h = before + after + h.substring(pos+7); - } - else { - h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7); - } - } - } - - // Insert content at the caret, plus add a marker for repositioning the caret - ed.execCommand("mceInsertRawHTML", false, h + ' '); - - // Reposition the caret to the marker, which was placed immediately after the inserted content. - // Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers. - // The second part of the code scrolls the content up if the caret is positioned off-screen. - // This is only necessary for WebKit browsers, but it doesn't hurt to use for all. - window.setTimeout(function() { - var marker = dom.get('_plain_text_marker'), - elm, vp, y, elmHeight; - - sel.select(marker, false); - d.execCommand("Delete", false, null); - marker = null; - - // Get element, position and height - elm = sel.getStart(); - vp = dom.getViewPort(w); - y = dom.getPos(elm).y; - elmHeight = elm.clientHeight; - - // Is element within viewport if not then scroll it into view - if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) { - d.body.scrollTop = y < vp.y ? y : y - vp.h + 25; - } - }, 0); - } - }, - - /** - * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. - */ - _legacySupport : function() { - var t = this, ed = t.editor; - - // Register command(s) for backwards compatibility - ed.addCommand("mcePasteWord", function() { - ed.windowManager.open({ - file: t.url + "/pasteword.htm", - width: parseInt(getParam(ed, "paste_dialog_width")), - height: parseInt(getParam(ed, "paste_dialog_height")), - inline: 1 - }); - }); - - if (getParam(ed, "paste_text_use_dialog")) { - ed.addCommand("mcePasteText", function() { - ed.windowManager.open({ - file : t.url + "/pastetext.htm", - width: parseInt(getParam(ed, "paste_dialog_width")), - height: parseInt(getParam(ed, "paste_dialog_height")), - inline : 1 - }); - }); - } - - // Register button for backwards compatibility - ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); - } - }); - - // Register plugin - tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); -})(); diff --git a/plugins/TinyMCE/js/plugins/paste/js/pastetext.js b/plugins/TinyMCE/js/plugins/paste/js/pastetext.js deleted file mode 100644 index c524f9eb03..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/js/pastetext.js +++ /dev/null @@ -1,36 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var PasteTextDialog = { - init : function() { - this.resize(); - }, - - insert : function() { - var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; - - // Convert linebreaks into paragraphs - if (document.getElementById('linebreaks').checked) { - lines = h.split(/\r?\n/); - if (lines.length > 1) { - h = ''; - tinymce.each(lines, function(row) { - h += '

    ' + row + '

    '; - }); - } - } - - tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); - tinyMCEPopup.close(); - }, - - resize : function() { - var vp = tinyMCEPopup.dom.getViewPort(window), el; - - el = document.getElementById('content'); - - el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 90) + 'px'; - } -}; - -tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); diff --git a/plugins/TinyMCE/js/plugins/paste/js/pasteword.js b/plugins/TinyMCE/js/plugins/paste/js/pasteword.js deleted file mode 100644 index a52731c368..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/js/pasteword.js +++ /dev/null @@ -1,51 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var PasteWordDialog = { - init : function() { - var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; - - // Create iframe - el.innerHTML = ''; - ifr = document.getElementById('iframe'); - doc = ifr.contentWindow.document; - - // Force absolute CSS urls - css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; - css = css.concat(tinymce.explode(ed.settings.content_css) || []); - tinymce.each(css, function(u) { - cssHTML += ''; - }); - - // Write content into iframe - doc.open(); - doc.write('' + cssHTML + ''); - doc.close(); - - doc.designMode = 'on'; - this.resize(); - - window.setTimeout(function() { - ifr.contentWindow.focus(); - }, 10); - }, - - insert : function() { - var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; - - tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); - tinyMCEPopup.close(); - }, - - resize : function() { - var vp = tinyMCEPopup.dom.getViewPort(window), el; - - el = document.getElementById('iframe'); - - if (el) { - el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 90) + 'px'; - } - } -}; - -tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js deleted file mode 100644 index eeac778960..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/langs/en_dlg.js +++ /dev/null @@ -1,5 +0,0 @@ -tinyMCE.addI18n('en.paste_dlg',{ -text_title:"Use CTRL+V on your keyboard to paste the text into the window.", -text_linebreaks:"Keep linebreaks", -word_title:"Use CTRL+V on your keyboard to paste the text into the window." -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/paste/pastetext.htm b/plugins/TinyMCE/js/plugins/paste/pastetext.htm deleted file mode 100644 index b655945476..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/pastetext.htm +++ /dev/null @@ -1,27 +0,0 @@ - - - {#paste.paste_text_desc} - - - - -
    -
    {#paste.paste_text_desc}
    - -
    - -
    - -
    - -
    {#paste_dlg.text_title}
    - - - -
    - - -
    -
    - - \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/paste/pasteword.htm b/plugins/TinyMCE/js/plugins/paste/pasteword.htm deleted file mode 100644 index 0f6bb41210..0000000000 --- a/plugins/TinyMCE/js/plugins/paste/pasteword.htm +++ /dev/null @@ -1,21 +0,0 @@ - - - {#paste.paste_word_desc} - - - - -
    -
    {#paste.paste_word_desc}
    - -
    {#paste_dlg.word_title}
    - -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/preview/editor_plugin.js b/plugins/TinyMCE/js/plugins/preview/editor_plugin.js deleted file mode 100644 index 507909c5f0..0000000000 --- a/plugins/TinyMCE/js/plugins/preview/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js deleted file mode 100644 index 80f00f0d9f..0000000000 --- a/plugins/TinyMCE/js/plugins/preview/editor_plugin_src.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Preview', { - init : function(ed, url) { - var t = this, css = tinymce.explode(ed.settings.content_css); - - t.editor = ed; - - // Force absolute CSS urls - tinymce.each(css, function(u, k) { - css[k] = ed.documentBaseURI.toAbsolute(u); - }); - - ed.addCommand('mcePreview', function() { - ed.windowManager.open({ - file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"), - width : parseInt(ed.getParam("plugin_preview_width", "550")), - height : parseInt(ed.getParam("plugin_preview_height", "600")), - resizable : "yes", - scrollbars : "yes", - popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"), - inline : ed.getParam("plugin_preview_inline", 1) - }, { - base : ed.documentBaseURI.getURI() - }); - }); - - ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'}); - }, - - getInfo : function() { - return { - longname : 'Preview', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('preview', tinymce.plugins.Preview); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/preview/example.html b/plugins/TinyMCE/js/plugins/preview/example.html deleted file mode 100644 index b2c3d90ce0..0000000000 --- a/plugins/TinyMCE/js/plugins/preview/example.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Example of a custom preview page - - - -Editor contents:
    -
    - -
    - - - diff --git a/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js b/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js deleted file mode 100644 index f8dc810527..0000000000 --- a/plugins/TinyMCE/js/plugins/preview/jscripts/embed.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. - */ - -function writeFlash(p) { - writeEmbed( - 'D27CDB6E-AE6D-11cf-96B8-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'application/x-shockwave-flash', - p - ); -} - -function writeShockWave(p) { - writeEmbed( - '166B1BCA-3F9C-11CF-8075-444553540000', - 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', - 'application/x-director', - p - ); -} - -function writeQuickTime(p) { - writeEmbed( - '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', - 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', - 'video/quicktime', - p - ); -} - -function writeRealMedia(p) { - writeEmbed( - 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', - 'audio/x-pn-realaudio-plugin', - p - ); -} - -function writeWindowsMedia(p) { - p.url = p.src; - writeEmbed( - '6BF52A52-394A-11D3-B153-00C04F79FAA6', - 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', - 'application/x-mplayer2', - p - ); -} - -function writeEmbed(cls, cb, mt, p) { - var h = '', n; - - h += ''; - - h += ' - - - - - -{#preview.preview_desc} - - - - - diff --git a/plugins/TinyMCE/js/plugins/print/editor_plugin.js b/plugins/TinyMCE/js/plugins/print/editor_plugin.js deleted file mode 100644 index b5b3a55edf..0000000000 --- a/plugins/TinyMCE/js/plugins/print/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js deleted file mode 100644 index 3933fe656c..0000000000 --- a/plugins/TinyMCE/js/plugins/print/editor_plugin_src.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Print', { - init : function(ed, url) { - ed.addCommand('mcePrint', function() { - ed.getWin().print(); - }); - - ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'}); - }, - - getInfo : function() { - return { - longname : 'Print', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('print', tinymce.plugins.Print); -})(); diff --git a/plugins/TinyMCE/js/plugins/save/editor_plugin.js b/plugins/TinyMCE/js/plugins/save/editor_plugin.js deleted file mode 100644 index 8e93996671..0000000000 --- a/plugins/TinyMCE/js/plugins/save/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js deleted file mode 100644 index f5a3de8f5f..0000000000 --- a/plugins/TinyMCE/js/plugins/save/editor_plugin_src.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.Save', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceSave', t._save, t); - ed.addCommand('mceCancel', t._cancel, t); - - // Register buttons - ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'}); - ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'}); - - ed.onNodeChange.add(t._nodeChange, t); - ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave'); - }, - - getInfo : function() { - return { - longname : 'Save', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _nodeChange : function(ed, cm, n) { - var ed = this.editor; - - if (ed.getParam('save_enablewhendirty')) { - cm.setDisabled('save', !ed.isDirty()); - cm.setDisabled('cancel', !ed.isDirty()); - } - }, - - // Private methods - - _save : function() { - var ed = this.editor, formObj, os, i, elementId; - - formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form'); - - if (ed.getParam("save_enablewhendirty") && !ed.isDirty()) - return; - - tinyMCE.triggerSave(); - - // Use callback instead - if (os = ed.getParam("save_onsavecallback")) { - if (ed.execCallback('save_onsavecallback', ed)) { - ed.startContent = tinymce.trim(ed.getContent({format : 'raw'})); - ed.nodeChanged(); - } - - return; - } - - if (formObj) { - ed.isNotDirty = true; - - if (formObj.onsubmit == null || formObj.onsubmit() != false) - formObj.submit(); - - ed.nodeChanged(); - } else - ed.windowManager.alert("Error: No form element found."); - }, - - _cancel : function() { - var ed = this.editor, os, h = tinymce.trim(ed.startContent); - - // Use callback instead - if (os = ed.getParam("save_oncancelcallback")) { - ed.execCallback('save_oncancelcallback', ed); - return; - } - - ed.setContent(h); - ed.undoManager.clear(); - ed.nodeChanged(); - } - }); - - // Register plugin - tinymce.PluginManager.add('save', tinymce.plugins.Save); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css b/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css deleted file mode 100644 index ecdf58c7b5..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/css/searchreplace.css +++ /dev/null @@ -1,6 +0,0 @@ -.panel_wrapper {height:85px;} -.panel_wrapper div.current {height:85px;} - -/* IE */ -* html .panel_wrapper {height:100px;} -* html .panel_wrapper div.current {height:100px;} diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js deleted file mode 100644 index 165bc12df5..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js deleted file mode 100644 index 4c87e8fa79..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/editor_plugin_src.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.SearchReplacePlugin', { - init : function(ed, url) { - function open(m) { - // Keep IE from writing out the f/r character to the editor - // instance while initializing a new dialog. See: #3131190 - window.focus(); - - ed.windowManager.open({ - file : url + '/searchreplace.htm', - width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), - height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)), - inline : 1, - auto_focus : 0 - }, { - mode : m, - search_string : ed.selection.getContent({format : 'text'}), - plugin_url : url - }); - }; - - // Register commands - ed.addCommand('mceSearch', function() { - open('search'); - }); - - ed.addCommand('mceReplace', function() { - open('replace'); - }); - - // Register buttons - ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'}); - ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'}); - - ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch'); - }, - - getInfo : function() { - return { - longname : 'Search/Replace', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js b/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js deleted file mode 100644 index 80284b9f3f..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/js/searchreplace.js +++ /dev/null @@ -1,142 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var SearchReplaceDialog = { - init : function(ed) { - var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); - - t.switchMode(m); - - f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); - - // Focus input field - f[m + '_panel_searchstring'].focus(); - - mcTabs.onChange.add(function(tab_id, panel_id) { - t.switchMode(tab_id.substring(0, tab_id.indexOf('_'))); - }); - }, - - switchMode : function(m) { - var f, lm = this.lastMode; - - if (lm != m) { - f = document.forms[0]; - - if (lm) { - f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value; - f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked; - f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked; - f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked; - } - - mcTabs.displayTab(m + '_tab', m + '_panel'); - document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none"; - document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none"; - this.lastMode = m; - } - }, - - searchNext : function(a) { - var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0; - - // Get input - f = document.forms[0]; - s = f[m + '_panel_searchstring'].value; - b = f[m + '_panel_backwardsu'].checked; - ca = f[m + '_panel_casesensitivebox'].checked; - rs = f['replace_panel_replacestring'].value; - - if (tinymce.isIE) { - r = ed.getDoc().selection.createRange(); - } - - if (s == '') - return; - - function fix() { - // Correct Firefox graphics glitches - // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? - r = se.getRng().cloneRange(); - ed.getDoc().execCommand('SelectAll', false, null); - se.setRng(r); - }; - - function replace() { - ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE - }; - - // IE flags - if (ca) - fl = fl | 4; - - switch (a) { - case 'all': - // Move caret to beginning of text - ed.execCommand('SelectAll'); - ed.selection.collapse(true); - - if (tinymce.isIE) { - ed.focus(); - r = ed.getDoc().selection.createRange(); - - while (r.findText(s, b ? -1 : 1, fl)) { - r.scrollIntoView(); - r.select(); - replace(); - fo = 1; - - if (b) { - r.moveEnd("character", -(rs.length)); // Otherwise will loop forever - } - } - - tinyMCEPopup.storeSelection(); - } else { - while (w.find(s, ca, b, false, false, false, false)) { - replace(); - fo = 1; - } - } - - if (fo) - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced')); - else - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - - return; - - case 'current': - if (!ed.selection.isCollapsed()) - replace(); - - break; - } - - se.collapse(b); - r = se.getRng(); - - // Whats the point - if (!s) - return; - - if (tinymce.isIE) { - ed.focus(); - r = ed.getDoc().selection.createRange(); - - if (r.findText(s, b ? -1 : 1, fl)) { - r.scrollIntoView(); - r.select(); - } else - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - - tinyMCEPopup.storeSelection(); - } else { - if (!w.find(s, ca, b, false, false, false, false)) - tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); - else - fix(); - } - } -}; - -tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog); diff --git a/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js deleted file mode 100644 index 370959afa3..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/langs/en_dlg.js +++ /dev/null @@ -1,16 +0,0 @@ -tinyMCE.addI18n('en.searchreplace_dlg',{ -searchnext_desc:"Find again", -notfound:"The search has been completed. The search string could not be found.", -search_title:"Find", -replace_title:"Find/Replace", -allreplaced:"All occurrences of the search string were replaced.", -findwhat:"Find what", -replacewith:"Replace with", -direction:"Direction", -up:"Up", -down:"Down", -mcase:"Match case", -findnext:"Find next", -replace:"Replace", -replaceall:"Replace all" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm b/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm deleted file mode 100644 index 5a22d8aa4d..0000000000 --- a/plugins/TinyMCE/js/plugins/searchreplace/searchreplace.htm +++ /dev/null @@ -1,100 +0,0 @@ - - - - {#searchreplace_dlg.replace_title} - - - - - - - - -
    - - -
    -
    - - - - - - - - - - - -
    - - - - - - - - - -
    - - - - - -
    -
    -
    - -
    - - - - - - - - - - - - - - - -
    - - - - - - - - - -
    - - - - - -
    -
    -
    - -
    - -
    - - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/spellchecker/css/content.css b/plugins/TinyMCE/js/plugins/spellchecker/css/content.css deleted file mode 100644 index 24efa02170..0000000000 --- a/plugins/TinyMCE/js/plugins/spellchecker/css/content.css +++ /dev/null @@ -1 +0,0 @@ -.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} diff --git a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js deleted file mode 100644 index 0c42739c6f..0000000000 --- a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}งฉซฎฑถทธปผฝพฟื๗ค\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(f.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(f.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(f.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(e,'$1$2')}f.replace(q,t)}});h.moveToBookmark(i)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js deleted file mode 100644 index ee4df887c9..0000000000 --- a/plugins/TinyMCE/js/plugins/spellchecker/editor_plugin_src.js +++ /dev/null @@ -1,434 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM; - - tinymce.create('tinymce.plugins.SpellcheckerPlugin', { - getInfo : function() { - return { - longname : 'Spellchecker', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - init : function(ed, url) { - var t = this, cm; - - t.url = url; - t.editor = ed; - t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}"); - - if (t.rpcUrl == '{backend}') { - // Sniff if the browser supports native spellchecking (Don't know of a better way) - if (tinymce.isIE) - return; - - t.hasSupport = true; - - // Disable the context menu when spellchecking is active - ed.onContextMenu.addToTop(function(ed, e) { - if (t.active) - return false; - }); - } - - // Register commands - ed.addCommand('mceSpellCheck', function() { - if (t.rpcUrl == '{backend}') { - // Enable/disable native spellchecker - t.editor.getBody().spellcheck = t.active = !t.active; - return; - } - - if (!t.active) { - ed.setProgressState(1); - t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) { - if (r.length > 0) { - t.active = 1; - t._markWords(r); - ed.setProgressState(0); - ed.nodeChanged(); - } else { - ed.setProgressState(0); - - if (ed.getParam('spellchecker_report_no_misspellings', true)) - ed.windowManager.alert('spellchecker.no_mpell'); - } - }); - } else - t._done(); - }); - - if (ed.settings.content_css !== false) - ed.contentCSS.push(url + '/css/content.css'); - - ed.onClick.add(t._showMenu, t); - ed.onContextMenu.add(t._showMenu, t); - ed.onBeforeGetContent.add(function() { - if (t.active) - t._removeWords(); - }); - - ed.onNodeChange.add(function(ed, cm) { - cm.setActive('spellchecker', t.active); - }); - - ed.onSetContent.add(function() { - t._done(); - }); - - ed.onBeforeGetContent.add(function() { - t._done(); - }); - - ed.onBeforeExecCommand.add(function(ed, cmd) { - if (cmd == 'mceFullScreen') - t._done(); - }); - - // Find selected language - t.languages = {}; - each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) { - if (k.indexOf('+') === 0) { - k = k.substring(1); - t.selectedLang = v; - } - - t.languages[k] = v; - }); - }, - - createControl : function(n, cm) { - var t = this, c, ed = t.editor; - - if (n == 'spellchecker') { - // Use basic button if we use the native spellchecker - if (t.rpcUrl == '{backend}') { - // Create simple toggle button if we have native support - if (t.hasSupport) - c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); - - return c; - } - - c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); - - c.onRenderMenu.add(function(c, m) { - m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - each(t.languages, function(v, k) { - var o = {icon : 1}, mi; - - o.onclick = function() { - if (v == t.selectedLang) { - return; - } - mi.setSelected(1); - t.selectedItem.setSelected(0); - t.selectedItem = mi; - t.selectedLang = v; - }; - - o.title = k; - mi = m.add(o); - mi.setSelected(v == t.selectedLang); - - if (v == t.selectedLang) - t.selectedItem = mi; - }) - }); - - return c; - } - }, - - // Internal functions - - _walk : function(n, f) { - var d = this.editor.getDoc(), w; - - if (d.createTreeWalker) { - w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); - - while ((n = w.nextNode()) != null) - f.call(this, n); - } else - tinymce.walk(n, f, 'childNodes'); - }, - - _getSeparators : function() { - var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}งฉซฎฑถทธปผฝพฟื๗ค\u201d\u201c'); - - // Build word separator regexp - for (i=0; i elements content is broken after spellchecking. - // Bug #1408: Preceding whitespace characters are removed - // @TODO: I'm not sure that both are still issues on IE9. - if (tinymce.isIE) { - // Enclose mispelled words with temporal tag - v = v.replace(rx, '$1$2'); - // Loop over the content finding mispelled words - while ((pos = v.indexOf('')) != -1) { - // Add text node for the content before the word - txt = v.substring(0, pos); - if (txt.length) { - node = doc.createTextNode(dom.decode(txt)); - elem.appendChild(node); - } - v = v.substring(pos+10); - pos = v.indexOf(''); - txt = v.substring(0, pos); - v = v.substring(pos+11); - // Add span element for the word - elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt)); - } - // Add text node for the rest of the content - if (v.length) { - node = doc.createTextNode(dom.decode(v)); - elem.appendChild(node); - } - } else { - // Other browsers preserve whitespace characters on innerHTML usage - elem.innerHTML = v.replace(rx, '$1$2'); - } - - // Finally, replace the node with the container - dom.replace(elem, n); - } - }); - - se.moveToBookmark(b); - }, - - _showMenu : function(ed, e) { - var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target; - - e = 0; // Fixes IE memory leak - - if (!m) { - m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'}); - t._menu = m; - } - - if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) { - m.removeAll(); - m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - - t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) { - var ignoreRpc; - - m.removeAll(); - - if (r.length > 0) { - m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - each(r, function(v) { - m.add({title : v, onclick : function() { - dom.replace(ed.getDoc().createTextNode(v), wordSpan); - t._checkDone(); - }}); - }); - - m.addSeparator(); - } else - m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); - - ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); - m.add({ - title : 'spellchecker.ignore_word', - onclick : function() { - var word = wordSpan.innerHTML; - - dom.remove(wordSpan, 1); - t._checkDone(); - - // tell the server if we need to - if (ignoreRpc) { - ed.setProgressState(1); - t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - } - }); - - m.add({ - title : 'spellchecker.ignore_words', - onclick : function() { - var word = wordSpan.innerHTML; - - t._removeWords(dom.decode(word)); - t._checkDone(); - - // tell the server if we need to - if (ignoreRpc) { - ed.setProgressState(1); - t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - } - }); - - if (t.editor.getParam("spellchecker_enable_learn_rpc")) { - m.add({ - title : 'spellchecker.learn_word', - onclick : function() { - var word = wordSpan.innerHTML; - - dom.remove(wordSpan, 1); - t._checkDone(); - - ed.setProgressState(1); - t._sendRPC('learnWord', [t.selectedLang, word], function(r) { - ed.setProgressState(0); - }); - } - }); - } - - m.update(); - }); - - p1 = DOM.getPos(ed.getContentAreaContainer()); - m.settings.offset_x = p1.x; - m.settings.offset_y = p1.y; - - ed.selection.select(wordSpan); - p1 = dom.getPos(wordSpan); - m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y); - - return tinymce.dom.Event.cancel(e); - } else - m.hideMenu(); - }, - - _checkDone : function() { - var t = this, ed = t.editor, dom = ed.dom, o; - - each(dom.select('span'), function(n) { - if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) { - o = true; - return false; - } - }); - - if (!o) - t._done(); - }, - - _done : function() { - var t = this, la = t.active; - - if (t.active) { - t.active = 0; - t._removeWords(); - - if (t._menu) - t._menu.hideMenu(); - - if (la) - t.editor.nodeChanged(); - } - }, - - _sendRPC : function(m, p, cb) { - var t = this; - - JSONRequest.sendRPC({ - url : t.rpcUrl, - method : m, - params : p, - success : cb, - error : function(e, x) { - t.editor.setProgressState(0); - t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText)); - } - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin); -})(); diff --git a/plugins/TinyMCE/js/plugins/spellchecker/img/wline.gif b/plugins/TinyMCE/js/plugins/spellchecker/img/wline.gif deleted file mode 100644 index 7d0a4dbca03cc13177a359a5f175dda819fdf464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 ycmZ?wbhEHbWMN=tXkcXcqowu#|9{1wEQ|~cj0`#qKmd|qU}ANVOOs?}um%7FLkRf* diff --git a/plugins/TinyMCE/js/plugins/style/css/props.css b/plugins/TinyMCE/js/plugins/style/css/props.css deleted file mode 100644 index eb1f264960..0000000000 --- a/plugins/TinyMCE/js/plugins/style/css/props.css +++ /dev/null @@ -1,13 +0,0 @@ -#text_font {width:250px;} -#text_size {width:70px;} -.mceAddSelectValue {background:#DDD;} -select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} -#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} -#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} -#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} -.panel_wrapper div.current {padding-top:10px;height:230px;} -.delim {border-left:1px solid gray;} -.tdelim {border-bottom:1px solid gray;} -#block_display {width:145px;} -#list_type {width:115px;} -.disabled {background:#EEE;} diff --git a/plugins/TinyMCE/js/plugins/style/editor_plugin.js b/plugins/TinyMCE/js/plugins/style/editor_plugin.js deleted file mode 100644 index cab2153c40..0000000000 --- a/plugins/TinyMCE/js/plugins/style/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:320+parseInt(a.getLang("style.delta_height",0)),inline:1},{plugin_url:b,style_text:a.selection.getNode().style.cssText})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js deleted file mode 100644 index 5f7755f184..0000000000 --- a/plugins/TinyMCE/js/plugins/style/editor_plugin_src.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.StylePlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceStyleProps', function() { - ed.windowManager.open({ - file : url + '/props.htm', - width : 480 + parseInt(ed.getLang('style.delta_width', 0)), - height : 320 + parseInt(ed.getLang('style.delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - style_text : ed.selection.getNode().style.cssText - }); - }); - - ed.addCommand('mceSetElementStyle', function(ui, v) { - if (e = ed.selection.getNode()) { - ed.dom.setAttrib(e, 'style', v); - ed.execCommand('mceRepaint'); - } - }); - - ed.onNodeChange.add(function(ed, cm, n) { - cm.setDisabled('styleprops', n.nodeName === 'BODY'); - }); - - // Register buttons - ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); - }, - - getInfo : function() { - return { - longname : 'Style', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/js/props.js b/plugins/TinyMCE/js/plugins/style/js/props.js deleted file mode 100644 index 6800a9a9aa..0000000000 --- a/plugins/TinyMCE/js/plugins/style/js/props.js +++ /dev/null @@ -1,635 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var defaultFonts = "" + - "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + - "Times New Roman, Times, serif=Times New Roman, Times, serif;" + - "Courier New, Courier, mono=Courier New, Courier, mono;" + - "Times New Roman, Times, serif=Times New Roman, Times, serif;" + - "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + - "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + - "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; - -var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; -var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; -var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; -var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; -var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; -var defaultTextStyle = "normal;italic;oblique"; -var defaultVariant = "normal;small-caps"; -var defaultLineHeight = "normal"; -var defaultAttachment = "fixed;scroll"; -var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; -var defaultPosH = "left;center;right"; -var defaultPosV = "top;center;bottom"; -var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; -var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; -var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; -var defaultBorderWidth = "thin;medium;thick"; -var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; - -function init() { - var ce = document.getElementById('container'), h; - - ce.style.cssText = tinyMCEPopup.getWindowArg('style_text'); - - h = getBrowserHTML('background_image_browser','background_image','image','advimage'); - document.getElementById("background_image_browser").innerHTML = h; - - document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); - document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); - document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); - document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); - document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); - document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); - - fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); - fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); - fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); - fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); - fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); - fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); - fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); - fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); - fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); - - fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); - fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); - - fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); - fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); - fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); - fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); - fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); - fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); - fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); - fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); - fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); - - fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); - fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); - fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); - fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); - - fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); - fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); - - fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); - fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); - - fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); - fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); - - fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); - - fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); - - fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); - fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); - - TinyMCE_EditableSelects.init(); - setupFormData(); - showDisabledControls(); -} - -function setupFormData() { - var ce = document.getElementById('container'), f = document.forms[0], s, b, i; - - // Setup text fields - - selectByValue(f, 'text_font', ce.style.fontFamily, true, true); - selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); - selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); - selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); - selectByValue(f, 'text_style', ce.style.fontStyle, true, true); - selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); - selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); - selectByValue(f, 'text_case', ce.style.textTransform, true, true); - selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); - f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); - updateColor('text_color_pick', 'text_color'); - f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); - f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); - f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); - f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); - - // Setup background fields - - f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); - updateColor('background_color_pick', 'background_color'); - f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); - selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); - selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); - selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); - selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); - selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); - - // Setup block fields - - selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); - selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); - selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); - selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); - selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); - selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); - f.block_text_indent.value = getNum(ce.style.textIndent); - selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); - selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); - selectByValue(f, 'block_display', ce.style.display, true, true); - - // Setup box fields - - f.box_width.value = getNum(ce.style.width); - selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); - - f.box_height.value = getNum(ce.style.height); - selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); - selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true); - - selectByValue(f, 'box_clear', ce.style.clear, true, true); - - setupBox(f, ce, 'box_padding', 'padding', ''); - setupBox(f, ce, 'box_margin', 'margin', ''); - - // Setup border fields - - setupBox(f, ce, 'border_style', 'border', 'Style'); - setupBox(f, ce, 'border_width', 'border', 'Width'); - setupBox(f, ce, 'border_color', 'border', 'Color'); - - updateColor('border_color_top_pick', 'border_color_top'); - updateColor('border_color_right_pick', 'border_color_right'); - updateColor('border_color_bottom_pick', 'border_color_bottom'); - updateColor('border_color_left_pick', 'border_color_left'); - - f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); - f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); - f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); - f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); - - // Setup list fields - - selectByValue(f, 'list_type', ce.style.listStyleType, true, true); - selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); - f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); - - // Setup box fields - - selectByValue(f, 'positioning_type', ce.style.position, true, true); - selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); - selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); - f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; - - f.positioning_width.value = getNum(ce.style.width); - selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); - - f.positioning_height.value = getNum(ce.style.height); - selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); - - setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); - - s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); - s = s.replace(/,/g, ' '); - - if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { - f.positioning_clip_top.value = getNum(getVal(s, 0)); - selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); - f.positioning_clip_right.value = getNum(getVal(s, 1)); - selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); - f.positioning_clip_bottom.value = getNum(getVal(s, 2)); - selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); - f.positioning_clip_left.value = getNum(getVal(s, 3)); - selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); - } else { - f.positioning_clip_top.value = getNum(getVal(s, 0)); - selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); - f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; - } - -// setupBox(f, ce, '', 'border', 'Color'); -} - -function getMeasurement(s) { - return s.replace(/^([0-9.]+)(.*)$/, "$2"); -} - -function getNum(s) { - if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) - return s.replace(/[^0-9.]/g, ''); - - return s; -} - -function inStr(s, n) { - return new RegExp(n, 'gi').test(s); -} - -function getVal(s, i) { - var a = s.split(' '); - - if (a.length > 1) - return a[i]; - - return ""; -} - -function setValue(f, n, v) { - if (f.elements[n].type == "text") - f.elements[n].value = v; - else - selectByValue(f, n, v, true, true); -} - -function setupBox(f, ce, fp, pr, sf, b) { - if (typeof(b) == "undefined") - b = ['Top', 'Right', 'Bottom', 'Left']; - - if (isSame(ce, pr, sf, b)) { - f.elements[fp + "_same"].checked = true; - - setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); - f.elements[fp + "_top"].disabled = false; - - f.elements[fp + "_right"].value = ""; - f.elements[fp + "_right"].disabled = true; - f.elements[fp + "_bottom"].value = ""; - f.elements[fp + "_bottom"].disabled = true; - f.elements[fp + "_left"].value = ""; - f.elements[fp + "_left"].disabled = true; - - if (f.elements[fp + "_top_measurement"]) { - selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); - f.elements[fp + "_left_measurement"].disabled = true; - f.elements[fp + "_bottom_measurement"].disabled = true; - f.elements[fp + "_right_measurement"].disabled = true; - } - } else { - f.elements[fp + "_same"].checked = false; - - setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); - f.elements[fp + "_top"].disabled = false; - - setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); - f.elements[fp + "_right"].disabled = false; - - setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); - f.elements[fp + "_bottom"].disabled = false; - - setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); - f.elements[fp + "_left"].disabled = false; - - if (f.elements[fp + "_top_measurement"]) { - selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); - selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); - selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); - selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); - f.elements[fp + "_left_measurement"].disabled = false; - f.elements[fp + "_bottom_measurement"].disabled = false; - f.elements[fp + "_right_measurement"].disabled = false; - } - } -} - -function isSame(e, pr, sf, b) { - var a = [], i, x; - - if (typeof(b) == "undefined") - b = ['Top', 'Right', 'Bottom', 'Left']; - - if (typeof(sf) == "undefined" || sf == null) - sf = ""; - - a[0] = e.style[pr + b[0] + sf]; - a[1] = e.style[pr + b[1] + sf]; - a[2] = e.style[pr + b[2] + sf]; - a[3] = e.style[pr + b[3] + sf]; - - for (i=0; i 0 ? s.substring(1) : s; - - if (f.text_none.checked) - s = "none"; - - ce.style.textDecoration = s; - - // Build background styles - - ce.style.backgroundColor = f.background_color.value; - ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; - ce.style.backgroundRepeat = f.background_repeat.value; - ce.style.backgroundAttachment = f.background_attachment.value; - - if (f.background_hpos.value != "") { - s = ""; - s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; - s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); - ce.style.backgroundPosition = s; - } - - // Build block styles - - ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); - ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); - ce.style.verticalAlign = f.block_vertical_alignment.value; - ce.style.textAlign = f.block_text_align.value; - ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); - ce.style.whiteSpace = f.block_whitespace.value; - ce.style.display = f.block_display.value; - - // Build box styles - - ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); - ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); - ce.style.styleFloat = f.box_float.value; - ce.style.cssFloat = f.box_float.value; - - ce.style.clear = f.box_clear.value; - - if (!f.box_padding_same.checked) { - ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); - ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); - ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); - ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); - } else - ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); - - if (!f.box_margin_same.checked) { - ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); - ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); - ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); - ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); - } else - ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); - - // Build border styles - - if (!f.border_style_same.checked) { - ce.style.borderTopStyle = f.border_style_top.value; - ce.style.borderRightStyle = f.border_style_right.value; - ce.style.borderBottomStyle = f.border_style_bottom.value; - ce.style.borderLeftStyle = f.border_style_left.value; - } else - ce.style.borderStyle = f.border_style_top.value; - - if (!f.border_width_same.checked) { - ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); - ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); - ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); - ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); - } else - ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); - - if (!f.border_color_same.checked) { - ce.style.borderTopColor = f.border_color_top.value; - ce.style.borderRightColor = f.border_color_right.value; - ce.style.borderBottomColor = f.border_color_bottom.value; - ce.style.borderLeftColor = f.border_color_left.value; - } else - ce.style.borderColor = f.border_color_top.value; - - // Build list styles - - ce.style.listStyleType = f.list_type.value; - ce.style.listStylePosition = f.list_position.value; - ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; - - // Build positioning styles - - ce.style.position = f.positioning_type.value; - ce.style.visibility = f.positioning_visibility.value; - - if (ce.style.width == "") - ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); - - if (ce.style.height == "") - ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); - - ce.style.zIndex = f.positioning_zindex.value; - ce.style.overflow = f.positioning_overflow.value; - - if (!f.positioning_placement_same.checked) { - ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); - ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); - ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); - ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); - } else { - s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); - ce.style.top = s; - ce.style.right = s; - ce.style.bottom = s; - ce.style.left = s; - } - - if (!f.positioning_clip_same.checked) { - s = "rect("; - s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; - s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); - s += ")"; - - if (s != "rect(auto auto auto auto)") - ce.style.clip = s; - } else { - s = "rect("; - t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; - s += t + " "; - s += t + " "; - s += t + " "; - s += t + ")"; - - if (s != "rect(auto auto auto auto)") - ce.style.clip = s; - } - - ce.style.cssText = ce.style.cssText; -} - -function isNum(s) { - return new RegExp('[0-9]+', 'g').test(s); -} - -function showDisabledControls() { - var f = document.forms, i, a; - - for (i=0; i 1) { - addSelectValue(f, s, p[0], p[1]); - - if (se) - selectByValue(f, s, p[1]); - } else { - addSelectValue(f, s, p[0], p[0]); - - if (se) - selectByValue(f, s, p[0]); - } - } -} - -function toggleSame(ce, pre) { - var el = document.forms[0].elements, i; - - if (ce.checked) { - el[pre + "_top"].disabled = false; - el[pre + "_right"].disabled = true; - el[pre + "_bottom"].disabled = true; - el[pre + "_left"].disabled = true; - - if (el[pre + "_top_measurement"]) { - el[pre + "_top_measurement"].disabled = false; - el[pre + "_right_measurement"].disabled = true; - el[pre + "_bottom_measurement"].disabled = true; - el[pre + "_left_measurement"].disabled = true; - } - } else { - el[pre + "_top"].disabled = false; - el[pre + "_right"].disabled = false; - el[pre + "_bottom"].disabled = false; - el[pre + "_left"].disabled = false; - - if (el[pre + "_top_measurement"]) { - el[pre + "_top_measurement"].disabled = false; - el[pre + "_right_measurement"].disabled = false; - el[pre + "_bottom_measurement"].disabled = false; - el[pre + "_left_measurement"].disabled = false; - } - } - - showDisabledControls(); -} - -function synch(fr, to) { - var f = document.forms[0]; - - f.elements[to].value = f.elements[fr].value; - - if (f.elements[fr + "_measurement"]) - selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js deleted file mode 100644 index df0a173c77..0000000000 --- a/plugins/TinyMCE/js/plugins/style/langs/en_dlg.js +++ /dev/null @@ -1,70 +0,0 @@ -tinyMCE.addI18n('en.style_dlg',{ -title:"Edit CSS Style", -apply:"Apply", -text_tab:"Text", -background_tab:"Background", -block_tab:"Block", -box_tab:"Box", -border_tab:"Border", -list_tab:"List", -positioning_tab:"Positioning", -text_props:"Text", -text_font:"Font", -text_size:"Size", -text_weight:"Weight", -text_style:"Style", -text_variant:"Variant", -text_lineheight:"Line height", -text_case:"Case", -text_color:"Color", -text_decoration:"Decoration", -text_overline:"overline", -text_underline:"underline", -text_striketrough:"strikethrough", -text_blink:"blink", -text_none:"none", -background_color:"Background color", -background_image:"Background image", -background_repeat:"Repeat", -background_attachment:"Attachment", -background_hpos:"Horizontal position", -background_vpos:"Vertical position", -block_wordspacing:"Word spacing", -block_letterspacing:"Letter spacing", -block_vertical_alignment:"Vertical alignment", -block_text_align:"Text align", -block_text_indent:"Text indent", -block_whitespace:"Whitespace", -block_display:"Display", -box_width:"Width", -box_height:"Height", -box_float:"Float", -box_clear:"Clear", -padding:"Padding", -same:"Same for all", -top:"Top", -right:"Right", -bottom:"Bottom", -left:"Left", -margin:"Margin", -style:"Style", -width:"Width", -height:"Height", -color:"Color", -list_type:"Type", -bullet_image:"Bullet image", -position:"Position", -positioning_type:"Type", -visibility:"Visibility", -zindex:"Z-index", -overflow:"Overflow", -placement:"Placement", -clip:"Clip", -text:"Text", -background:"Background", -block:"Block", -box:"Box", -border:"Border", -list:"List", -position:"Position" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/style/props.htm b/plugins/TinyMCE/js/plugins/style/props.htm deleted file mode 100644 index b5a3d15d9e..0000000000 --- a/plugins/TinyMCE/js/plugins/style/props.htm +++ /dev/null @@ -1,838 +0,0 @@ - - - - {#style_dlg.title} - - - - - - - - - - -
    - - -
    -
    -
    - {#style_dlg.text} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - -
      - - -
    -
    - -
    - - - -
    - - - - - - -
    - -   - - -
    -
    - -
    - - - - - -
     
    -
    {#style_dlg.text_decoration} - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    - -
    -
    - {#style_dlg.background} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
     
    -
    - - - - -
     
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    -
    -
    - -
    -
    - {#style_dlg.block} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - - -
    -
    -
    -
    - -
    -
    - {#style_dlg.box} - - - - - - - - - - - - - - -
    - - - - - - -
      - - -
    -
       
    - - - - - - -
      - - -
    -
       
    -
    -
    - {#style_dlg.padding} - - - - - - - - - - - - - - - - - - - - - - -
     
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    -
    -
    - -
    -
    - {#style_dlg.margin} - - - - - - - - - - - - - - - - - - - - - - -
     
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    - - - - - - -
      - - -
    -
    -
    -
    -
    -
    - -
    -
    - {#style_dlg.border} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      {#style_dlg.style} {#style_dlg.width} {#style_dlg.color}
          
    {#style_dlg.top}   - - - - - - -
      - - -
    -
      - - - - - -
     
    -
    {#style_dlg.right}   - - - - - - -
      - - -
    -
      - - - - - -
     
    -
    {#style_dlg.bottom}   - - - - - - -
      - - -
    -
      - - - - - -
     
    -
    {#style_dlg.left}   - - - - - - -
      - - -
    -
      - - - - - -
     
    -
    -
    -
    - -
    -
    - {#style_dlg.list} - - - - - - - - - - - - - - - -
    -
    -
    - -
    -
    - {#style_dlg.position} - - - - - - - - - - - - - - - - - - - - - -
       
    - - - - - - -
      - - -
    -
       
    - - - - - - -
      - - -
    -
       
    - -
    -
    - {#style_dlg.placement} - - - - - - - - - - - - - - - - - - - - - - -
     
    {#style_dlg.top} - - - - - - -
      - - -
    -
    {#style_dlg.right} - - - - - - -
      - - -
    -
    {#style_dlg.bottom} - - - - - - -
      - - -
    -
    {#style_dlg.left} - - - - - - -
      - - -
    -
    -
    -
    - -
    -
    - {#style_dlg.clip} - - - - - - - - - - - - - - - - - - - - - - -
     
    {#style_dlg.top} - - - - - - -
      - - -
    -
    {#style_dlg.right} - - - - - - -
      - - -
    -
    {#style_dlg.bottom} - - - - - - -
      - - -
    -
    {#style_dlg.left} - - - - - - -
      - - -
    -
    -
    -
    -
    -
    - -
    - -
    - - - -
    -
    - -
    -
    -
    - - - diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js deleted file mode 100644 index d18689ddb9..0000000000 --- a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(r){n=c.select(":input:enabled,*[tabindex]");function i(s){return s.type!="hidden"&&s.tabIndex!="-1"&&!(n[m].style.display=="none")&&!(n[m].style.visibility=="hidden")}d(n,function(t,s){if(t.id==l.id){j=s;return false}});if(r>0){for(m=j+1;m=0;m--){if(i(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js deleted file mode 100644 index f4545e1670..0000000000 --- a/plugins/TinyMCE/js/plugins/tabfocus/editor_plugin_src.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; - - tinymce.create('tinymce.plugins.TabFocusPlugin', { - init : function(ed, url) { - function tabCancel(ed, e) { - if (e.keyCode === 9) - return Event.cancel(e); - }; - - function tabHandler(ed, e) { - var x, i, f, el, v; - - function find(d) { - el = DOM.select(':input:enabled,*[tabindex]'); - function canSelect(e) { - return e.type != 'hidden' && - e.tabIndex != '-1' && - !(el[i].style.display == "none") && - !(el[i].style.visibility == "hidden"); - } - - each(el, function(e, i) { - if (e.id == ed.id) { - x = i; - return false; - } - }); - - if (d > 0) { - for (i = x + 1; i < el.length; i++) { - if (canSelect(el[i])) - return el[i]; - } - } else { - for (i = x - 1; i >= 0; i--) { - if (canSelect(el[i])) - return el[i]; - } - } - - return null; - }; - - if (e.keyCode === 9) { - v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); - - if (v.length == 1) { - v[1] = v[0]; - v[0] = ':prev'; - } - - // Find element to focus - if (e.shiftKey) { - if (v[0] == ':prev') - el = find(-1); - else - el = DOM.get(v[0]); - } else { - if (v[1] == ':next') - el = find(1); - else - el = DOM.get(v[1]); - } - - if (el) { - if (el.id && (ed = tinymce.get(el.id || el.name))) - ed.focus(); - else - window.setTimeout(function() { - if (!tinymce.isWebKit) - window.focus(); - el.focus(); - }, 10); - - return Event.cancel(e); - } - } - }; - - ed.onKeyUp.add(tabCancel); - - if (tinymce.isGecko) { - ed.onKeyPress.add(tabHandler); - ed.onKeyDown.add(tabCancel); - } else - ed.onKeyDown.add(tabHandler); - - }, - - getInfo : function() { - return { - longname : 'Tabfocus', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/cell.htm b/plugins/TinyMCE/js/plugins/table/cell.htm deleted file mode 100644 index a72a8d6973..0000000000 --- a/plugins/TinyMCE/js/plugins/table/cell.htm +++ /dev/null @@ -1,180 +0,0 @@ - - - - {#table_dlg.cell_title} - - - - - - - - - -
    - - -
    -
    -
    - {#table_dlg.general_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - - - -
    - -
    -
    -
    - -
    -
    - {#table_dlg.advanced_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - - - - - -
     
    -
    - - - - - -
     
    -
    - - - - - -
     
    -
    -
    -
    -
    - -
    -
    - -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/table/css/cell.css b/plugins/TinyMCE/js/plugins/table/css/cell.css deleted file mode 100644 index a067ecdfed..0000000000 --- a/plugins/TinyMCE/js/plugins/table/css/cell.css +++ /dev/null @@ -1,17 +0,0 @@ -/* CSS file for cell dialog in the table plugin */ - -.panel_wrapper div.current { - height: 200px; -} - -.advfield { - width: 200px; -} - -#action { - margin-bottom: 3px; -} - -#class { - width: 150px; -} \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/css/row.css b/plugins/TinyMCE/js/plugins/table/css/row.css deleted file mode 100644 index 1f7755dafa..0000000000 --- a/plugins/TinyMCE/js/plugins/table/css/row.css +++ /dev/null @@ -1,25 +0,0 @@ -/* CSS file for row dialog in the table plugin */ - -.panel_wrapper div.current { - height: 200px; -} - -.advfield { - width: 200px; -} - -#action { - margin-bottom: 3px; -} - -#rowtype,#align,#valign,#class,#height { - width: 150px; -} - -#height { - width: 50px; -} - -.col2 { - padding-left: 20px; -} diff --git a/plugins/TinyMCE/js/plugins/table/css/table.css b/plugins/TinyMCE/js/plugins/table/css/table.css deleted file mode 100644 index d11c3f69cb..0000000000 --- a/plugins/TinyMCE/js/plugins/table/css/table.css +++ /dev/null @@ -1,13 +0,0 @@ -/* CSS file for table dialog in the table plugin */ - -.panel_wrapper div.current { - height: 245px; -} - -.advfield { - width: 200px; -} - -#class { - width: 150px; -} diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin.js b/plugins/TinyMCE/js/plugins/table/editor_plugin.js deleted file mode 100644 index f0100315b4..0000000000 --- a/plugins/TinyMCE/js/plugins/table/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(c){var d=c.each;function b(f,g){var h=g.ownerDocument,e=h.createRange(),j;e.setStartBefore(g);e.setEnd(f.endContainer,f.endOffset);j=h.createElement("body");j.appendChild(e.cloneContents());return j.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(H,G,K){var f,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;f=[];d(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);d(O,function(P,Q){Q+=M;d(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(f[Q]){while(f[Q][R]){R++}}U=h(W,"rowspan");V=h(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!c.isIE){M.innerHTML='
    '}}return M}function q(){var M=G.createRng();d(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}d(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=f[Math.min(f.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=f[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=f[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(e(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(e(P.cells[0]),P.cells[0])}}}}}function C(){d(f,function(M,N){d(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=h(P,"colspan");R=h(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&f[M-1][R]){V=f[M-1][R].elm;O=h(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=e(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function g(N){var O,M;d(f,function(P,Q){d(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});d(f,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=h(P,"colspan");Q=h(P,"rowspan");if(R==1){if(!N){G.insertAfter(e(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(e(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];d(f,function(N,O){d(N,function(Q,P){if(j(Q)&&c.inArray(M,P)===-1){d(f,function(T){var R=T[P].elm,S;S=h(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");d(Q.cells,function(S){var T=h(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);d(f[R.y],function(S){var T;S=S.elm;if(S!=O){T=h(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();d(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();d(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;d(f,function(S){var R;Q=0;d(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}d(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=f[y][P];if(!S.real){if(P-(S.colspan-1)N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(f[y][x]){G.addClass(f[y][x].elm,"mceSelected")}}}}}c.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:g,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}c.create("tinymce.plugins.TablePlugin",{init:function(f,g){var e,l,h=true;function k(o){var n=f.selection,m=f.dom.getParent(o||n.getNode(),"table");if(m){return new a(m,f.dom,n)}}function j(){f.getBody().style.webkitUserSelect="";if(h){f.dom.removeClass(f.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");h=false}}d([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(m){f.addButton(m[0],{title:m[1],cmd:m[2],ui:m[3]})});if(!c.isIE){f.onClick.add(function(m,n){n=n.target;if(n.nodeName==="TABLE"){m.selection.select(n);m.nodeChanged()}})}f.onPreProcess.add(function(n,o){var m,p,q,s=n.dom,r;m=s.select("table",o.node);p=m.length;while(p--){q=m[p];s.setAttrib(q,"data-mce-style","");if((r=s.getAttrib(q,"width"))){s.setStyle(q,"width",r);s.setAttrib(q,"width","")}if((r=s.getAttrib(q,"height"))){s.setStyle(q,"height",r);s.setAttrib(q,"height","")}}});f.onNodeChange.add(function(o,m,r){var q;r=o.selection.getStart();q=o.dom.getParent(r,"td,th,caption");m.setActive("table",r.nodeName==="TABLE"||!!q);if(q&&q.nodeName==="CAPTION"){q=0}m.setDisabled("delete_table",!q);m.setDisabled("delete_col",!q);m.setDisabled("delete_table",!q);m.setDisabled("delete_row",!q);m.setDisabled("col_after",!q);m.setDisabled("col_before",!q);m.setDisabled("row_after",!q);m.setDisabled("row_before",!q);m.setDisabled("row_props",!q);m.setDisabled("cell_props",!q);m.setDisabled("split_cells",!q);m.setDisabled("merge_cells",!q)});f.onInit.add(function(n){var m,q,r=n.dom,o;e=n.windowManager;n.onMouseDown.add(function(s,t){if(t.button!=2){j();q=r.getParent(t.target,"td,th");m=r.getParent(q,"table")}});r.bind(n.getDoc(),"mouseover",function(w){var u,t,v=w.target;if(q&&(o||v!=q)&&(v.nodeName=="TD"||v.nodeName=="TH")){t=r.getParent(v,"table");if(t==m){if(!o){o=k(t);o.setStartCell(q);n.getBody().style.webkitUserSelect="none"}o.setEndCell(v);h=true}u=n.selection.getSel();try{if(u.removeAllRanges){u.removeAllRanges()}else{u.empty()}}catch(s){}w.preventDefault()}});n.onMouseUp.add(function(B,C){var t,v=B.selection,D,E=v.getSel(),s,w,u,A;if(q){if(o){B.getBody().style.webkitUserSelect=""}function z(F,H){var G=new c.dom.TreeWalker(F,F);do{if(F.nodeType==3&&c.trim(F.nodeValue).length!=0){if(H){t.setStart(F,0)}else{t.setEnd(F,F.nodeValue.length)}return}if(F.nodeName=="BR"){if(H){t.setStartBefore(F)}else{t.setEndBefore(F)}return}}while(F=(H?G.next():G.prev()))}D=r.select("td.mceSelected,th.mceSelected");if(D.length>0){t=r.createRng();w=D[0];A=D[D.length-1];t.setStart(w);t.setEnd(w);z(w,1);s=new c.dom.TreeWalker(w,r.getParent(D[0],"table"));do{if(w.nodeName=="TD"||w.nodeName=="TH"){if(!r.hasClass(w,"mceSelected")){break}u=w}}while(w=s.next());z(u);v.setRng(t)}B.nodeChanged();q=o=m=null}});n.onKeyUp.add(function(s,t){j()});if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(u,s,w){var z,v=n.selection,t=v.getNode()||n.getBody();if(n.dom.getParent(w,"td")||n.dom.getParent(w,"th")||n.dom.select("td.mceSelected,th.mceSelected").length){s.removeAll();if(t.nodeName=="A"&&!n.dom.getAttrib(t,"name")){s.add({title:"advanced.link_desc",icon:"link",cmd:n.plugins.advlink?"mceAdvLink":"mceLink",ui:true});s.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});s.addSeparator()}if(t.nodeName=="IMG"&&t.className.indexOf("mceItem")==-1){s.add({title:"advanced.image_desc",icon:"image",cmd:n.plugins.advimage?"mceAdvImage":"mceImage",ui:true});s.addSeparator()}s.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});s.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});s.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});s.addSeparator();z=s.addMenu({title:"table.cell"});z.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});z.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});z.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});z=s.addMenu({title:"table.row"});z.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});z.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});z.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});z.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});z.addSeparator();z.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});z.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});z.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!l);z.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!l);z=s.addMenu({title:"table.col"});z.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});z.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});z.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{s.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!c.isIE){function p(){var s;for(s=n.getBody().lastChild;s&&s.nodeType==3&&!s.nodeValue.length;s=s.previousSibling){}if(s&&s.nodeName=="TABLE"){n.dom.add(n.getBody(),"p",null,'
    ')}}if(c.isGecko){n.onKeyDown.add(function(t,v){var s,u,w=t.dom;if(v.keyCode==37||v.keyCode==38){s=t.selection.getRng();u=w.getParent(s.startContainer,"table");if(u&&t.getBody().firstChild==u){if(b(s,u)){s=w.createRng();s.setStartBefore(u);s.setEndBefore(u);t.selection.setRng(s);v.preventDefault()}}}})}n.onKeyUp.add(p);n.onSetContent.add(p);n.onVisualAid.add(p);n.onPreProcess.add(function(s,u){var t=u.node.lastChild;if(t&&t.childNodes.length==1&&t.firstChild.nodeName=="BR"){s.dom.remove(t)}});p()}});d({mceTableSplitCells:function(m){m.split()},mceTableMergeCells:function(n){var o,p,m;m=f.dom.getParent(f.selection.getNode(),"th,td");if(m){o=m.rowSpan;p=m.colSpan}if(!f.dom.select("td.mceSelected,th.mceSelected").length){e.open({url:g+"/merge_cells.htm",width:240+parseInt(f.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(f.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:o,cols:p,onaction:function(q){n.merge(m,q.cols,q.rows)},plugin_url:g})}else{n.merge()}},mceTableInsertRowBefore:function(m){m.insertRow(true)},mceTableInsertRowAfter:function(m){m.insertRow()},mceTableInsertColBefore:function(m){m.insertCol(true)},mceTableInsertColAfter:function(m){m.insertCol()},mceTableDeleteCol:function(m){m.deleteCols()},mceTableDeleteRow:function(m){m.deleteRows()},mceTableCutRow:function(m){l=m.cutRows()},mceTableCopyRow:function(m){l=m.copyRows()},mceTablePasteRowBefore:function(m){m.pasteRows(l,true)},mceTablePasteRowAfter:function(m){m.pasteRows(l)},mceTableDelete:function(m){m.deleteTable()}},function(n,m){f.addCommand(m,function(){var o=k();if(o){n(o);f.execCommand("mceRepaint");j()}})});d({mceInsertTable:function(m){e.open({url:g+"/table.htm",width:400+parseInt(f.getLang("table.table_delta_width",0)),height:320+parseInt(f.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:m?m.action:0})},mceTableRowProps:function(){e.open({url:g+"/row.htm",width:400+parseInt(f.getLang("table.rowprops_delta_width",0)),height:295+parseInt(f.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})},mceTableCellProps:function(){e.open({url:g+"/cell.htm",width:400+parseInt(f.getLang("table.cellprops_delta_width",0)),height:295+parseInt(f.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}},function(n,m){f.addCommand(m,function(o,p){n(p)})})}});c.PluginManager.add("table",c.plugins.TablePlugin)})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js deleted file mode 100644 index 5b9b53d8e6..0000000000 --- a/plugins/TinyMCE/js/plugins/table/editor_plugin_src.js +++ /dev/null @@ -1,1209 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - var each = tinymce.each; - - // Checks if the selection/caret is at the start of the specified block element - function isAtStart(rng, par) { - var doc = par.ownerDocument, rng2 = doc.createRange(), elm; - - rng2.setStartBefore(par); - rng2.setEnd(rng.endContainer, rng.endOffset); - - elm = doc.createElement('body'); - elm.appendChild(rng2.cloneContents()); - - // Check for text characters of other elements that should be treated as content - return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; - }; - - /** - * Table Grid class. - */ - function TableGrid(table, dom, selection) { - var grid, startPos, endPos, selectedCell; - - buildGrid(); - selectedCell = dom.getParent(selection.getStart(), 'th,td'); - if (selectedCell) { - startPos = getPos(selectedCell); - endPos = findEndPos(); - selectedCell = getCell(startPos.x, startPos.y); - } - - function cloneNode(node, children) { - node = node.cloneNode(children); - node.removeAttribute('id'); - - return node; - } - - function buildGrid() { - var startY = 0; - - grid = []; - - each(['thead', 'tbody', 'tfoot'], function(part) { - var rows = dom.select('> ' + part + ' tr', table); - - each(rows, function(tr, y) { - y += startY; - - each(dom.select('> td, > th', tr), function(td, x) { - var x2, y2, rowspan, colspan; - - // Skip over existing cells produced by rowspan - if (grid[y]) { - while (grid[y][x]) - x++; - } - - // Get col/rowspan from cell - rowspan = getSpanVal(td, 'rowspan'); - colspan = getSpanVal(td, 'colspan'); - - // Fill out rowspan/colspan right and down - for (y2 = y; y2 < y + rowspan; y2++) { - if (!grid[y2]) - grid[y2] = []; - - for (x2 = x; x2 < x + colspan; x2++) { - grid[y2][x2] = { - part : part, - real : y2 == y && x2 == x, - elm : td, - rowspan : rowspan, - colspan : colspan - }; - } - } - }); - }); - - startY += rows.length; - }); - }; - - function getCell(x, y) { - var row; - - row = grid[y]; - if (row) - return row[x]; - }; - - function getSpanVal(td, name) { - return parseInt(td.getAttribute(name) || 1); - }; - - function setSpanVal(td, name, val) { - if (td) { - val = parseInt(val); - - if (val === 1) - td.removeAttribute(name, 1); - else - td.setAttribute(name, val, 1); - } - } - - function isCellSelected(cell) { - return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); - }; - - function getSelectedRows() { - var rows = []; - - each(table.rows, function(row) { - each(row.cells, function(cell) { - if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { - rows.push(row); - return false; - } - }); - }); - - return rows; - }; - - function deleteTable() { - var rng = dom.createRng(); - - rng.setStartAfter(table); - rng.setEndAfter(table); - - selection.setRng(rng); - - dom.remove(table); - }; - - function cloneCell(cell) { - var formatNode; - - // Clone formats - tinymce.walk(cell, function(node) { - var curNode; - - if (node.nodeType == 3) { - each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { - node = cloneNode(node, false); - - if (!formatNode) - formatNode = curNode = node; - else if (curNode) - curNode.appendChild(node); - - curNode = node; - }); - - // Add something to the inner node - if (curNode) - curNode.innerHTML = tinymce.isIE ? ' ' : '
    '; - - return false; - } - }, 'childNodes'); - - cell = cloneNode(cell, false); - setSpanVal(cell, 'rowSpan', 1); - setSpanVal(cell, 'colSpan', 1); - - if (formatNode) { - cell.appendChild(formatNode); - } else { - if (!tinymce.isIE) - cell.innerHTML = '
    '; - } - - return cell; - }; - - function cleanup() { - var rng = dom.createRng(); - - // Empty rows - each(dom.select('tr', table), function(tr) { - if (tr.cells.length == 0) - dom.remove(tr); - }); - - // Empty table - if (dom.select('tr', table).length == 0) { - rng.setStartAfter(table); - rng.setEndAfter(table); - selection.setRng(rng); - dom.remove(table); - return; - } - - // Empty header/body/footer - each(dom.select('thead,tbody,tfoot', table), function(part) { - if (part.rows.length == 0) - dom.remove(part); - }); - - // Restore selection to start position if it still exists - buildGrid(); - - // Restore the selection to the closest table position - row = grid[Math.min(grid.length - 1, startPos.y)]; - if (row) { - selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); - selection.collapse(true); - } - }; - - function fillLeftDown(x, y, rows, cols) { - var tr, x2, r, c, cell; - - tr = grid[y][x].elm.parentNode; - for (r = 1; r <= rows; r++) { - tr = dom.getNext(tr, 'tr'); - - if (tr) { - // Loop left to find real cell - for (x2 = x; x2 >= 0; x2--) { - cell = grid[y + r][x2].elm; - - if (cell.parentNode == tr) { - // Append clones after - for (c = 1; c <= cols; c++) - dom.insertAfter(cloneCell(cell), cell); - - break; - } - } - - if (x2 == -1) { - // Insert nodes before first cell - for (c = 1; c <= cols; c++) - tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); - } - } - } - }; - - function split() { - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan, newCell, i; - - if (isCellSelected(cell)) { - cell = cell.elm; - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan > 1 || rowSpan > 1) { - setSpanVal(cell, 'rowSpan', 1); - setSpanVal(cell, 'colSpan', 1); - - // Insert cells right - for (i = 0; i < colSpan - 1; i++) - dom.insertAfter(cloneCell(cell), cell); - - fillLeftDown(x, y, rowSpan - 1, colSpan); - } - } - }); - }); - }; - - function merge(cell, cols, rows) { - var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; - - // Use specified cell and cols/rows - if (cell) { - pos = getPos(cell); - startX = pos.x; - startY = pos.y; - endX = startX + (cols - 1); - endY = startY + (rows - 1); - } else { - // Use selection - startX = startPos.x; - startY = startPos.y; - endX = endPos.x; - endY = endPos.y; - } - - // Find start/end cells - startCell = getCell(startX, startY); - endCell = getCell(endX, endY); - - // Check if the cells exists and if they are of the same part for example tbody = tbody - if (startCell && endCell && startCell.part == endCell.part) { - // Split and rebuild grid - split(); - buildGrid(); - - // Set row/col span to start cell - startCell = getCell(startX, startY).elm; - setSpanVal(startCell, 'colSpan', (endX - startX) + 1); - setSpanVal(startCell, 'rowSpan', (endY - startY) + 1); - - // Remove other cells and add it's contents to the start cell - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - if (!grid[y] || !grid[y][x]) - continue; - - cell = grid[y][x].elm; - - if (cell != startCell) { - // Move children to startCell - children = tinymce.grep(cell.childNodes); - each(children, function(node) { - startCell.appendChild(node); - }); - - // Remove bogus nodes if there is children in the target cell - if (children.length) { - children = tinymce.grep(startCell.childNodes); - count = 0; - each(children, function(node) { - if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) - startCell.removeChild(node); - }); - } - - // Remove cell - dom.remove(cell); - } - } - } - - // Remove empty rows etc and restore caret location - cleanup(); - } - }; - - function insertRow(before) { - var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; - - // Find first/last row - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - cell = cell.elm; - rowElm = cell.parentNode; - newRow = cloneNode(rowElm, false); - posY = y; - - if (before) - return false; - } - }); - - if (before) - return !posY; - }); - - for (x = 0; x < grid[0].length; x++) { - // Cell not found could be because of an invalid table structure - if (!grid[posY][x]) - continue; - - cell = grid[posY][x].elm; - - if (cell != lastCell) { - if (!before) { - rowSpan = getSpanVal(cell, 'rowspan'); - if (rowSpan > 1) { - setSpanVal(cell, 'rowSpan', rowSpan + 1); - continue; - } - } else { - // Check if cell above can be expanded - if (posY > 0 && grid[posY - 1][x]) { - otherCell = grid[posY - 1][x].elm; - rowSpan = getSpanVal(otherCell, 'rowSpan'); - if (rowSpan > 1) { - setSpanVal(otherCell, 'rowSpan', rowSpan + 1); - continue; - } - } - } - - // Insert new cell into new row - newCell = cloneCell(cell); - setSpanVal(newCell, 'colSpan', cell.colSpan); - - newRow.appendChild(newCell); - - lastCell = cell; - } - } - - if (newRow.hasChildNodes()) { - if (!before) - dom.insertAfter(newRow, rowElm); - else - rowElm.parentNode.insertBefore(newRow, rowElm); - } - }; - - function insertCol(before) { - var posX, lastCell; - - // Find first/last column - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell)) { - posX = x; - - if (before) - return false; - } - }); - - if (before) - return !posX; - }); - - each(grid, function(row, y) { - var cell, rowSpan, colSpan; - - if (!row[posX]) - return; - - cell = row[posX].elm; - if (cell != lastCell) { - colSpan = getSpanVal(cell, 'colspan'); - rowSpan = getSpanVal(cell, 'rowspan'); - - if (colSpan == 1) { - if (!before) { - dom.insertAfter(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } else { - cell.parentNode.insertBefore(cloneCell(cell), cell); - fillLeftDown(posX, y, rowSpan - 1, colSpan); - } - } else - setSpanVal(cell, 'colSpan', cell.colSpan + 1); - - lastCell = cell; - } - }); - }; - - function deleteCols() { - var cols = []; - - // Get selected column indexes - each(grid, function(row, y) { - each(row, function(cell, x) { - if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { - each(grid, function(row) { - var cell = row[x].elm, colSpan; - - colSpan = getSpanVal(cell, 'colSpan'); - - if (colSpan > 1) - setSpanVal(cell, 'colSpan', colSpan - 1); - else - dom.remove(cell); - }); - - cols.push(x); - } - }); - }); - - cleanup(); - }; - - function deleteRows() { - var rows; - - function deleteRow(tr) { - var nextTr, pos, lastCell; - - nextTr = dom.getNext(tr, 'tr'); - - // Move down row spanned cells - each(tr.cells, function(cell) { - var rowSpan = getSpanVal(cell, 'rowSpan'); - - if (rowSpan > 1) { - setSpanVal(cell, 'rowSpan', rowSpan - 1); - pos = getPos(cell); - fillLeftDown(pos.x, pos.y, 1, 1); - } - }); - - // Delete cells - pos = getPos(tr.cells[0]); - each(grid[pos.y], function(cell) { - var rowSpan; - - cell = cell.elm; - - if (cell != lastCell) { - rowSpan = getSpanVal(cell, 'rowSpan'); - - if (rowSpan <= 1) - dom.remove(cell); - else - setSpanVal(cell, 'rowSpan', rowSpan - 1); - - lastCell = cell; - } - }); - }; - - // Get selected rows and move selection out of scope - rows = getSelectedRows(); - - // Delete all selected rows - each(rows.reverse(), function(tr) { - deleteRow(tr); - }); - - cleanup(); - }; - - function cutRows() { - var rows = getSelectedRows(); - - dom.remove(rows); - cleanup(); - - return rows; - }; - - function copyRows() { - var rows = getSelectedRows(); - - each(rows, function(row, i) { - rows[i] = cloneNode(row, true); - }); - - return rows; - }; - - function pasteRows(rows, before) { - var selectedRows = getSelectedRows(), - targetRow = selectedRows[before ? 0 : selectedRows.length - 1], - targetCellCount = targetRow.cells.length; - - // Calc target cell count - each(grid, function(row) { - var match; - - targetCellCount = 0; - each(row, function(cell, x) { - if (cell.real) - targetCellCount += cell.colspan; - - if (cell.elm.parentNode == targetRow) - match = 1; - }); - - if (match) - return false; - }); - - if (!before) - rows.reverse(); - - each(rows, function(row) { - var cellCount = row.cells.length, cell; - - // Remove col/rowspans - for (i = 0; i < cellCount; i++) { - cell = row.cells[i]; - setSpanVal(cell, 'colSpan', 1); - setSpanVal(cell, 'rowSpan', 1); - } - - // Needs more cells - for (i = cellCount; i < targetCellCount; i++) - row.appendChild(cloneCell(row.cells[cellCount - 1])); - - // Needs less cells - for (i = targetCellCount; i < cellCount; i++) - dom.remove(row.cells[i]); - - // Add before/after - if (before) - targetRow.parentNode.insertBefore(row, targetRow); - else - dom.insertAfter(row, targetRow); - }); - }; - - function getPos(target) { - var pos; - - each(grid, function(row, y) { - each(row, function(cell, x) { - if (cell.elm == target) { - pos = {x : x, y : y}; - return false; - } - }); - - return !pos; - }); - - return pos; - }; - - function setStartCell(cell) { - startPos = getPos(cell); - }; - - function findEndPos() { - var pos, maxX, maxY; - - maxX = maxY = 0; - - each(grid, function(row, y) { - each(row, function(cell, x) { - var colSpan, rowSpan; - - if (isCellSelected(cell)) { - cell = grid[y][x]; - - if (x > maxX) - maxX = x; - - if (y > maxY) - maxY = y; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - }); - }); - - return {x : maxX, y : maxY}; - }; - - function setEndCell(cell) { - var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; - - endPos = getPos(cell); - - if (startPos && endPos) { - // Get start/end positions - startX = Math.min(startPos.x, endPos.x); - startY = Math.min(startPos.y, endPos.y); - endX = Math.max(startPos.x, endPos.x); - endY = Math.max(startPos.y, endPos.y); - - // Expand end positon to include spans - maxX = endX; - maxY = endY; - - // Expand startX - for (y = startY; y <= maxY; y++) { - cell = grid[y][startX]; - - if (!cell.real) { - if (startX - (cell.colspan - 1) < startX) - startX -= cell.colspan - 1; - } - } - - // Expand startY - for (x = startX; x <= maxX; x++) { - cell = grid[startY][x]; - - if (!cell.real) { - if (startY - (cell.rowspan - 1) < startY) - startY -= cell.rowspan - 1; - } - } - - // Find max X, Y - for (y = startY; y <= endY; y++) { - for (x = startX; x <= endX; x++) { - cell = grid[y][x]; - - if (cell.real) { - colSpan = cell.colspan - 1; - rowSpan = cell.rowspan - 1; - - if (colSpan) { - if (x + colSpan > maxX) - maxX = x + colSpan; - } - - if (rowSpan) { - if (y + rowSpan > maxY) - maxY = y + rowSpan; - } - } - } - } - - // Remove current selection - dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - - // Add new selection - for (y = startY; y <= maxY; y++) { - for (x = startX; x <= maxX; x++) { - if (grid[y][x]) - dom.addClass(grid[y][x].elm, 'mceSelected'); - } - } - } - }; - - // Expose to public - tinymce.extend(this, { - deleteTable : deleteTable, - split : split, - merge : merge, - insertRow : insertRow, - insertCol : insertCol, - deleteCols : deleteCols, - deleteRows : deleteRows, - cutRows : cutRows, - copyRows : copyRows, - pasteRows : pasteRows, - getPos : getPos, - setStartCell : setStartCell, - setEndCell : setEndCell - }); - }; - - tinymce.create('tinymce.plugins.TablePlugin', { - init : function(ed, url) { - var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload - - function createTableGrid(node) { - var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); - - if (tblElm) - return new TableGrid(tblElm, ed.dom, selection); - }; - - function cleanup() { - // Restore selection possibilities - ed.getBody().style.webkitUserSelect = ''; - - if (hasCellSelection) { - ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); - hasCellSelection = false; - } - }; - - // Register buttons - each([ - ['table', 'table.desc', 'mceInsertTable', true], - ['delete_table', 'table.del', 'mceTableDelete'], - ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], - ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], - ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], - ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], - ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], - ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], - ['row_props', 'table.row_desc', 'mceTableRowProps', true], - ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], - ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], - ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] - ], function(c) { - ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); - }); - - // Select whole table is a table border is clicked - if (!tinymce.isIE) { - ed.onClick.add(function(ed, e) { - e = e.target; - - if (e.nodeName === 'TABLE') { - ed.selection.select(e); - ed.nodeChanged(); - } - }); - } - - ed.onPreProcess.add(function(ed, args) { - var nodes, i, node, dom = ed.dom, value; - - nodes = dom.select('table', args.node); - i = nodes.length; - while (i--) { - node = nodes[i]; - dom.setAttrib(node, 'data-mce-style', ''); - - if ((value = dom.getAttrib(node, 'width'))) { - dom.setStyle(node, 'width', value); - dom.setAttrib(node, 'width', ''); - } - - if ((value = dom.getAttrib(node, 'height'))) { - dom.setStyle(node, 'height', value); - dom.setAttrib(node, 'height', ''); - } - } - }); - - // Handle node change updates - ed.onNodeChange.add(function(ed, cm, n) { - var p; - - n = ed.selection.getStart(); - p = ed.dom.getParent(n, 'td,th,caption'); - cm.setActive('table', n.nodeName === 'TABLE' || !!p); - - // Disable table tools if we are in caption - if (p && p.nodeName === 'CAPTION') - p = 0; - - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_col', !p); - cm.setDisabled('delete_table', !p); - cm.setDisabled('delete_row', !p); - cm.setDisabled('col_after', !p); - cm.setDisabled('col_before', !p); - cm.setDisabled('row_after', !p); - cm.setDisabled('row_before', !p); - cm.setDisabled('row_props', !p); - cm.setDisabled('cell_props', !p); - cm.setDisabled('split_cells', !p); - cm.setDisabled('merge_cells', !p); - }); - - ed.onInit.add(function(ed) { - var startTable, startCell, dom = ed.dom, tableGrid; - - winMan = ed.windowManager; - - // Add cell selection logic - ed.onMouseDown.add(function(ed, e) { - if (e.button != 2) { - cleanup(); - - startCell = dom.getParent(e.target, 'td,th'); - startTable = dom.getParent(startCell, 'table'); - } - }); - - dom.bind(ed.getDoc(), 'mouseover', function(e) { - var sel, table, target = e.target; - - if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { - table = dom.getParent(target, 'table'); - if (table == startTable) { - if (!tableGrid) { - tableGrid = createTableGrid(table); - tableGrid.setStartCell(startCell); - - ed.getBody().style.webkitUserSelect = 'none'; - } - - tableGrid.setEndCell(target); - hasCellSelection = true; - } - - // Remove current selection - sel = ed.selection.getSel(); - - try { - if (sel.removeAllRanges) - sel.removeAllRanges(); - else - sel.empty(); - } catch (ex) { - // IE9 might throw errors here - } - - e.preventDefault(); - } - }); - - ed.onMouseUp.add(function(ed, e) { - var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; - - // Move selection to startCell - if (startCell) { - if (tableGrid) - ed.getBody().style.webkitUserSelect = ''; - - function setPoint(node, start) { - var walker = new tinymce.dom.TreeWalker(node, node); - - do { - // Text node - if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { - if (start) - rng.setStart(node, 0); - else - rng.setEnd(node, node.nodeValue.length); - - return; - } - - // BR element - if (node.nodeName == 'BR') { - if (start) - rng.setStartBefore(node); - else - rng.setEndBefore(node); - - return; - } - } while (node = (start ? walker.next() : walker.prev())); - }; - - // Try to expand text selection as much as we can only Gecko supports cell selection - selectedCells = dom.select('td.mceSelected,th.mceSelected'); - if (selectedCells.length > 0) { - rng = dom.createRng(); - node = selectedCells[0]; - endNode = selectedCells[selectedCells.length - 1]; - rng.setStart(node); - rng.setEnd(node); - - setPoint(node, 1); - walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); - - do { - if (node.nodeName == 'TD' || node.nodeName == 'TH') { - if (!dom.hasClass(node, 'mceSelected')) - break; - - lastNode = node; - } - } while (node = walker.next()); - - setPoint(lastNode); - - sel.setRng(rng); - } - - ed.nodeChanged(); - startCell = tableGrid = startTable = null; - } - }); - - ed.onKeyUp.add(function(ed, e) { - cleanup(); - }); - - // Add context menu - if (ed && ed.plugins.contextmenu) { - ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { - var sm, se = ed.selection, el = se.getNode() || ed.getBody(); - - if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { - m.removeAll(); - - if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { - m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); - m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); - m.addSeparator(); - } - - if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { - m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); - m.addSeparator(); - } - - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); - m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); - m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); - m.addSeparator(); - - // Cell menu - sm = m.addMenu({title : 'table.cell'}); - sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); - sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); - sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); - - // Row menu - sm = m.addMenu({title : 'table.row'}); - sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); - sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); - sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); - sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); - sm.addSeparator(); - sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); - sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); - sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); - sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); - - // Column menu - sm = m.addMenu({title : 'table.col'}); - sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); - sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); - sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); - } else - m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); - }); - } - - // Fixes an issue on Gecko where it's impossible to place the caret behind a table - // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled - if (!tinymce.isIE) { - function fixTableCaretPos() { - var last; - - // Skip empty text nodes form the end - for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; - - if (last && last.nodeName == 'TABLE') - ed.dom.add(ed.getBody(), 'p', null, '
    '); - }; - - // Fixes an bug where it's impossible to place the caret before a table in Gecko - // this fix solves it by detecting when the caret is at the beginning of such a table - // and then manually moves the caret infront of the table - if (tinymce.isGecko) { - ed.onKeyDown.add(function(ed, e) { - var rng, table, dom = ed.dom; - - // On gecko it's not possible to place the caret before a table - if (e.keyCode == 37 || e.keyCode == 38) { - rng = ed.selection.getRng(); - table = dom.getParent(rng.startContainer, 'table'); - - if (table && ed.getBody().firstChild == table) { - if (isAtStart(rng, table)) { - rng = dom.createRng(); - - rng.setStartBefore(table); - rng.setEndBefore(table); - - ed.selection.setRng(rng); - - e.preventDefault(); - } - } - } - }); - } - - ed.onKeyUp.add(fixTableCaretPos); - ed.onSetContent.add(fixTableCaretPos); - ed.onVisualAid.add(fixTableCaretPos); - - ed.onPreProcess.add(function(ed, o) { - var last = o.node.lastChild; - - if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') - ed.dom.remove(last); - }); - - fixTableCaretPos(); - } - }); - - // Register action commands - each({ - mceTableSplitCells : function(grid) { - grid.split(); - }, - - mceTableMergeCells : function(grid) { - var rowSpan, colSpan, cell; - - cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); - if (cell) { - rowSpan = cell.rowSpan; - colSpan = cell.colSpan; - } - - if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { - winMan.open({ - url : url + '/merge_cells.htm', - width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), - height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), - inline : 1 - }, { - rows : rowSpan, - cols : colSpan, - onaction : function(data) { - grid.merge(cell, data.cols, data.rows); - }, - plugin_url : url - }); - } else - grid.merge(); - }, - - mceTableInsertRowBefore : function(grid) { - grid.insertRow(true); - }, - - mceTableInsertRowAfter : function(grid) { - grid.insertRow(); - }, - - mceTableInsertColBefore : function(grid) { - grid.insertCol(true); - }, - - mceTableInsertColAfter : function(grid) { - grid.insertCol(); - }, - - mceTableDeleteCol : function(grid) { - grid.deleteCols(); - }, - - mceTableDeleteRow : function(grid) { - grid.deleteRows(); - }, - - mceTableCutRow : function(grid) { - clipboardRows = grid.cutRows(); - }, - - mceTableCopyRow : function(grid) { - clipboardRows = grid.copyRows(); - }, - - mceTablePasteRowBefore : function(grid) { - grid.pasteRows(clipboardRows, true); - }, - - mceTablePasteRowAfter : function(grid) { - grid.pasteRows(clipboardRows); - }, - - mceTableDelete : function(grid) { - grid.deleteTable(); - } - }, function(func, name) { - ed.addCommand(name, function() { - var grid = createTableGrid(); - - if (grid) { - func(grid); - ed.execCommand('mceRepaint'); - cleanup(); - } - }); - }); - - // Register dialog commands - each({ - mceInsertTable : function(val) { - winMan.open({ - url : url + '/table.htm', - width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), - height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), - inline : 1 - }, { - plugin_url : url, - action : val ? val.action : 0 - }); - }, - - mceTableRowProps : function() { - winMan.open({ - url : url + '/row.htm', - width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }, - - mceTableCellProps : function() { - winMan.open({ - url : url + '/cell.htm', - width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), - height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - } - }, function(func, name) { - ed.addCommand(name, function(ui, val) { - func(val); - }); - }); - } - }); - - // Register plugin - tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); -})(tinymce); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/js/cell.js b/plugins/TinyMCE/js/plugins/table/js/cell.js deleted file mode 100644 index d6f3290599..0000000000 --- a/plugins/TinyMCE/js/plugins/table/js/cell.js +++ /dev/null @@ -1,319 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var ed; - -function init() { - ed = tinyMCEPopup.editor; - tinyMCEPopup.resizeToInnerSize(); - - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') - - var inst = ed; - var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th"); - var formObj = document.forms[0]; - var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style")); - - // Get table cell data - var celltype = tdElm.nodeName.toLowerCase(); - var align = ed.dom.getAttrib(tdElm, 'align'); - var valign = ed.dom.getAttrib(tdElm, 'valign'); - var width = trimSize(getStyle(tdElm, 'width', 'width')); - var height = trimSize(getStyle(tdElm, 'height', 'height')); - var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); - var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); - var className = ed.dom.getAttrib(tdElm, 'class'); - var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - var id = ed.dom.getAttrib(tdElm, 'id'); - var lang = ed.dom.getAttrib(tdElm, 'lang'); - var dir = ed.dom.getAttrib(tdElm, 'dir'); - var scope = ed.dom.getAttrib(tdElm, 'scope'); - - // Setup form - addClassesToList('class', 'table_cell_styles'); - TinyMCE_EditableSelects.init(); - - if (!ed.dom.hasClass(tdElm, 'mceSelected')) { - formObj.bordercolor.value = bordercolor; - formObj.bgcolor.value = bgcolor; - formObj.backgroundimage.value = backgroundimage; - formObj.width.value = width; - formObj.height.value = height; - formObj.id.value = id; - formObj.lang.value = lang; - formObj.style.value = ed.dom.serializeStyle(st); - selectByValue(formObj, 'align', align); - selectByValue(formObj, 'valign', valign); - selectByValue(formObj, 'class', className, true, true); - selectByValue(formObj, 'celltype', celltype); - selectByValue(formObj, 'dir', dir); - selectByValue(formObj, 'scope', scope); - - // Resize some elements - if (isVisible('backgroundimagebrowser')) - document.getElementById('backgroundimage').style.width = '180px'; - - updateColor('bordercolor_pick', 'bordercolor'); - updateColor('bgcolor_pick', 'bgcolor'); - } else - tinyMCEPopup.dom.hide('action'); -} - -function updateAction() { - var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; - - if (!AutoValidator.validate(formObj)) { - tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); - return false; - } - - tinyMCEPopup.restoreSelection(); - el = ed.selection.getStart(); - tdElm = ed.dom.getParent(el, "td,th"); - trElm = ed.dom.getParent(el, "tr"); - tableElm = ed.dom.getParent(el, "table"); - - // Cell is selected - if (ed.dom.hasClass(tdElm, 'mceSelected')) { - // Update all selected sells - tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) { - updateCell(td); - }); - - ed.addVisual(); - ed.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - return; - } - - switch (getSelectValue(formObj, 'action')) { - case "cell": - var celltype = getSelectValue(formObj, 'celltype'); - var scope = getSelectValue(formObj, 'scope'); - - function doUpdate(s) { - if (s) { - updateCell(tdElm); - - ed.addVisual(); - ed.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - } - }; - - if (ed.getParam("accessibility_warnings", 1)) { - if (celltype == "th" && scope == "") - tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate); - else - doUpdate(1); - - return; - } - - updateCell(tdElm); - break; - - case "row": - var cell = trElm.firstChild; - - if (cell.nodeName != "TD" && cell.nodeName != "TH") - cell = nextCell(cell); - - do { - cell = updateCell(cell, true); - } while ((cell = nextCell(cell)) != null); - - break; - - case "col": - var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr"); - - if (cell.nodeName != "TD" && cell.nodeName != "TH") - cell = nextCell(cell); - - do { - if (cell == tdElm) - break; - col += cell.getAttribute("colspan"); - } while ((cell = nextCell(cell)) != null); - - for (var i=0; i 0) { - tinymce.each(tableElm.rows, function(tr) { - var i; - - for (i = 0; i < tr.cells.length; i++) { - if (dom.hasClass(tr.cells[i], 'mceSelected')) { - updateRow(tr, true); - return; - } - } - }); - - inst.addVisual(); - inst.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - tinyMCEPopup.close(); - return; - } - - switch (action) { - case "row": - updateRow(trElm); - break; - - case "all": - var rows = tableElm.getElementsByTagName("tr"); - - for (var i=0; i colLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); - return false; - } else if (rowLimit && rows > rowLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); - return false; - } else if (cellLimit && cols * rows > cellLimit) { - tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); - return false; - } - - // Update table - if (action == "update") { - dom.setAttrib(elm, 'cellPadding', cellpadding, true); - dom.setAttrib(elm, 'cellSpacing', cellspacing, true); - dom.setAttrib(elm, 'border', border); - dom.setAttrib(elm, 'align', align); - dom.setAttrib(elm, 'frame', frame); - dom.setAttrib(elm, 'rules', rules); - dom.setAttrib(elm, 'class', className); - dom.setAttrib(elm, 'style', style); - dom.setAttrib(elm, 'id', id); - dom.setAttrib(elm, 'summary', summary); - dom.setAttrib(elm, 'dir', dir); - dom.setAttrib(elm, 'lang', lang); - - capEl = inst.dom.select('caption', elm)[0]; - - if (capEl && !caption) - capEl.parentNode.removeChild(capEl); - - if (!capEl && caption) { - capEl = elm.ownerDocument.createElement('caption'); - - if (!tinymce.isIE) - capEl.innerHTML = '
    '; - - elm.insertBefore(capEl, elm.firstChild); - } - - if (width && inst.settings.inline_styles) { - dom.setStyle(elm, 'width', width); - dom.setAttrib(elm, 'width', ''); - } else { - dom.setAttrib(elm, 'width', width, true); - dom.setStyle(elm, 'width', ''); - } - - // Remove these since they are not valid XHTML - dom.setAttrib(elm, 'borderColor', ''); - dom.setAttrib(elm, 'bgColor', ''); - dom.setAttrib(elm, 'background', ''); - - if (height && inst.settings.inline_styles) { - dom.setStyle(elm, 'height', height); - dom.setAttrib(elm, 'height', ''); - } else { - dom.setAttrib(elm, 'height', height, true); - dom.setStyle(elm, 'height', ''); - } - - if (background != '') - elm.style.backgroundImage = "url('" + background + "')"; - else - elm.style.backgroundImage = ''; - -/* if (tinyMCEPopup.getParam("inline_styles")) { - if (width != '') - elm.style.width = getCSSSize(width); - }*/ - - if (bordercolor != "") { - elm.style.borderColor = bordercolor; - elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; - elm.style.borderWidth = border == "" ? "1px" : border; - } else - elm.style.borderColor = ''; - - elm.style.backgroundColor = bgcolor; - elm.style.height = getCSSSize(height); - - inst.addVisual(); - - // Fix for stange MSIE align bug - //elm.outerHTML = elm.outerHTML; - - inst.nodeChanged(); - inst.execCommand('mceEndUndoLevel'); - - // Repaint if dimensions changed - if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) - inst.execCommand('mceRepaint'); - - tinyMCEPopup.close(); - return true; - } - - // Create new table - html += ''); - - tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { - if (patt) - patt += ','; - - patt += n + ' ._mce_marker'; - }); - - tinymce.each(inst.dom.select(patt), function(n) { - inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); - }); - - dom.setOuterHTML(dom.select('br._mce_marker')[0], html); - } else - inst.execCommand('mceInsertContent', false, html); - - tinymce.each(dom.select('table[data-mce-new]'), function(node) { - var td = dom.select('td', node); - - try { - // IE9 might fail to do this selection - inst.selection.select(td[0], true); - inst.selection.collapse(); - } catch (ex) { - // Ignore - } - - dom.setAttrib(node, 'data-mce-new', ''); - }); - - inst.addVisual(); - inst.execCommand('mceEndUndoLevel'); - - tinyMCEPopup.close(); -} - -function makeAttrib(attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib]; - - if (typeof(value) == "undefined" || value == null) { - value = ""; - - if (valueElm) - value = valueElm.value; - } - - if (value == "") - return ""; - - // XML encode it - value = value.replace(/&/g, '&'); - value = value.replace(/\"/g, '"'); - value = value.replace(//g, '>'); - - return ' ' + attrib + '="' + value + '"'; -} - -function init() { - tinyMCEPopup.resizeToInnerSize(); - - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); - document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); - document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); - - var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); - var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; - var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = ""; - var inst = tinyMCEPopup.editor, dom = inst.dom; - var formObj = document.forms[0]; - var elm = dom.getParent(inst.selection.getNode(), "table"); - - action = tinyMCEPopup.getWindowArg('action'); - - if (!action) - action = elm ? "update" : "insert"; - - if (elm && action != "insert") { - var rowsAr = elm.rows; - var cols = 0; - for (var i=0; i cols) - cols = rowsAr[i].cells.length; - - cols = cols; - rows = rowsAr.length; - - st = dom.parseStyle(dom.getAttrib(elm, "style")); - border = trimSize(getStyle(elm, 'border', 'borderWidth')); - cellpadding = dom.getAttrib(elm, 'cellpadding', ""); - cellspacing = dom.getAttrib(elm, 'cellspacing', ""); - width = trimSize(getStyle(elm, 'width', 'width')); - height = trimSize(getStyle(elm, 'height', 'height')); - bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); - bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); - align = dom.getAttrib(elm, 'align', align); - frame = dom.getAttrib(elm, 'frame'); - rules = dom.getAttrib(elm, 'rules'); - className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); - id = dom.getAttrib(elm, 'id'); - summary = dom.getAttrib(elm, 'summary'); - style = dom.serializeStyle(st); - dir = dom.getAttrib(elm, 'dir'); - lang = dom.getAttrib(elm, 'lang'); - background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; - - orgTableWidth = width; - orgTableHeight = height; - - action = "update"; - formObj.insert.value = inst.getLang('update'); - } - - addClassesToList('class', "table_styles"); - TinyMCE_EditableSelects.init(); - - // Update form - selectByValue(formObj, 'align', align); - selectByValue(formObj, 'tframe', frame); - selectByValue(formObj, 'rules', rules); - selectByValue(formObj, 'class', className, true, true); - formObj.cols.value = cols; - formObj.rows.value = rows; - formObj.border.value = border; - formObj.cellpadding.value = cellpadding; - formObj.cellspacing.value = cellspacing; - formObj.width.value = width; - formObj.height.value = height; - formObj.bordercolor.value = bordercolor; - formObj.bgcolor.value = bgcolor; - formObj.id.value = id; - formObj.summary.value = summary; - formObj.style.value = style; - formObj.dir.value = dir; - formObj.lang.value = lang; - formObj.backgroundimage.value = background; - - updateColor('bordercolor_pick', 'bordercolor'); - updateColor('bgcolor_pick', 'bgcolor'); - - // Resize some elements - if (isVisible('backgroundimagebrowser')) - document.getElementById('backgroundimage').style.width = '180px'; - - // Disable some fields in update mode - if (action == "update") { - formObj.cols.disabled = true; - formObj.rows.disabled = true; - } -} - -function changedSize() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - -/* var width = formObj.width.value; - if (width != "") - st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : ""; - else - st['width'] = "";*/ - - var height = formObj.height.value; - if (height != "") - st['height'] = getCSSSize(height); - else - st['height'] = ""; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedBackgroundImage() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedBorder() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - // Update border width if the element has a color - if (formObj.border.value != "" && formObj.bordercolor.value != "") - st['border-width'] = formObj.border.value + "px"; - - formObj.style.value = dom.serializeStyle(st); -} - -function changedColor() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - st['background-color'] = formObj.bgcolor.value; - - if (formObj.bordercolor.value != "") { - st['border-color'] = formObj.bordercolor.value; - - // Add border-width if it's missing - if (!st['border-width']) - st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; - } - - formObj.style.value = dom.serializeStyle(st); -} - -function changedStyle() { - var formObj = document.forms[0]; - var st = dom.parseStyle(formObj.style.value); - - if (st['background-image']) - formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); - else - formObj.backgroundimage.value = ''; - - if (st['width']) - formObj.width.value = trimSize(st['width']); - - if (st['height']) - formObj.height.value = trimSize(st['height']); - - if (st['background-color']) { - formObj.bgcolor.value = st['background-color']; - updateColor('bgcolor_pick','bgcolor'); - } - - if (st['border-color']) { - formObj.bordercolor.value = st['border-color']; - updateColor('bordercolor_pick','bordercolor'); - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js b/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js deleted file mode 100644 index 0816efb9c6..0000000000 --- a/plugins/TinyMCE/js/plugins/table/langs/en_dlg.js +++ /dev/null @@ -1,75 +0,0 @@ -tinyMCE.addI18n('en.table_dlg',{ -general_tab:"General", -advanced_tab:"Advanced", -general_props:"General properties", -advanced_props:"Advanced properties", -rowtype:"Row in table part", -title:"Insert/Modify table", -width:"Width", -height:"Height", -cols:"Columns", -rows:"Rows", -cellspacing:"Cellspacing", -cellpadding:"Cellpadding", -border:"Border", -align:"Alignment", -align_default:"Default", -align_left:"Left", -align_right:"Right", -align_middle:"Center", -row_title:"Table row properties", -cell_title:"Table cell properties", -cell_type:"Cell type", -valign:"Vertical alignment", -align_top:"Top", -align_bottom:"Bottom", -bordercolor:"Border color", -bgcolor:"Background color", -merge_cells_title:"Merge table cells", -id:"Id", -style:"Style", -langdir:"Language direction", -langcode:"Language code", -mime:"Target MIME type", -ltr:"Left to right", -rtl:"Right to left", -bgimage:"Background image", -summary:"Summary", -td:"Data", -th:"Header", -cell_cell:"Update current cell", -cell_row:"Update all cells in row", -cell_col:"Update all cells in column", -cell_all:"Update all cells in table", -row_row:"Update current row", -row_odd:"Update odd rows in table", -row_even:"Update even rows in table", -row_all:"Update all rows in table", -thead:"Table Head", -tbody:"Table Body", -tfoot:"Table Foot", -scope:"Scope", -rowgroup:"Row Group", -colgroup:"Col Group", -col_limit:"You've exceeded the maximum number of columns of {$cols}.", -row_limit:"You've exceeded the maximum number of rows of {$rows}.", -cell_limit:"You've exceeded the maximum number of cells of {$cells}.", -missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.", -caption:"Table caption", -frame:"Frame", -frame_none:"none", -frame_groups:"groups", -frame_rows:"rows", -frame_cols:"cols", -frame_all:"all", -rules:"Rules", -rules_void:"void", -rules_above:"above", -rules_below:"below", -rules_hsides:"hsides", -rules_lhs:"lhs", -rules_rhs:"rhs", -rules_vsides:"vsides", -rules_box:"box", -rules_border:"border" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/table/merge_cells.htm b/plugins/TinyMCE/js/plugins/table/merge_cells.htm deleted file mode 100644 index d231090e79..0000000000 --- a/plugins/TinyMCE/js/plugins/table/merge_cells.htm +++ /dev/null @@ -1,32 +0,0 @@ - - - - {#table_dlg.merge_cells_title} - - - - - - -
    -
    - {#table_dlg.merge_cells_title} - - - - - - - - - -
    :
    :
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/table/row.htm b/plugins/TinyMCE/js/plugins/table/row.htm deleted file mode 100644 index 1885401f6b..0000000000 --- a/plugins/TinyMCE/js/plugins/table/row.htm +++ /dev/null @@ -1,158 +0,0 @@ - - - - {#table_dlg.row_title} - - - - - - - - - -
    - - -
    -
    -
    - {#table_dlg.general_props} - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    -
    -
    - -
    -
    - {#table_dlg.advanced_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - - - - - -
     
    -
    - - - - - - -
     
    -
    -
    -
    -
    -
    - -
    -
    - -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/table/table.htm b/plugins/TinyMCE/js/plugins/table/table.htm deleted file mode 100644 index 09d3700f77..0000000000 --- a/plugins/TinyMCE/js/plugins/table/table.htm +++ /dev/null @@ -1,188 +0,0 @@ - - - - {#table_dlg.title} - - - - - - - - - - -
    - - -
    -
    -
    - {#table_dlg.general_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    - -
    -
    - {#table_dlg.advanced_props} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - -
     
    -
    - -
    - -
    - -
    - - - - - -
     
    -
    - - - - - -
     
    -
    -
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/template/blank.htm b/plugins/TinyMCE/js/plugins/template/blank.htm deleted file mode 100644 index ecde53fae7..0000000000 --- a/plugins/TinyMCE/js/plugins/template/blank.htm +++ /dev/null @@ -1,12 +0,0 @@ - - - blank_page - - - - - - - diff --git a/plugins/TinyMCE/js/plugins/template/css/template.css b/plugins/TinyMCE/js/plugins/template/css/template.css deleted file mode 100644 index 2d23a4938c..0000000000 --- a/plugins/TinyMCE/js/plugins/template/css/template.css +++ /dev/null @@ -1,23 +0,0 @@ -#frmbody { - padding: 10px; - background-color: #FFF; - border: 1px solid #CCC; -} - -.frmRow { - margin-bottom: 10px; -} - -#templatesrc { - border: none; - width: 320px; - height: 240px; -} - -.title { - padding-bottom: 5px; -} - -.mceActionPanel { - padding-top: 5px; -} diff --git a/plugins/TinyMCE/js/plugins/template/editor_plugin.js b/plugins/TinyMCE/js/plugins/template/editor_plugin.js deleted file mode 100644 index ebe3c27d78..0000000000 --- a/plugins/TinyMCE/js/plugins/template/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length 0) { - el = dom.create('div', null); - el.appendChild(n[0].cloneNode(true)); - } - - function hasClass(n, c) { - return new RegExp('\\b' + c + '\\b', 'g').test(n.className); - }; - - each(dom.select('*', el), function(n) { - // Replace cdate - if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|'))) - n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format"))); - - // Replace mdate - if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) - n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); - - // Replace selection - if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|'))) - n.innerHTML = sel; - }); - - t._replaceVals(el); - - ed.execCommand('mceInsertContent', false, el.innerHTML); - ed.addVisual(); - }, - - _replaceVals : function(e) { - var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values'); - - each(dom.select('*', e), function(e) { - each(vl, function(v, k) { - if (dom.hasClass(e, k)) { - if (typeof(vl[k]) == 'function') - vl[k](e); - } - }); - }); - }, - - _getDateTime : function(d, fmt) { - if (!fmt) - return ""; - - function addZeros(value, len) { - var i; - - value = "" + value; - - if (value.length < len) { - for (i=0; i<(len-value.length); i++) - value = "0" + value; - } - - return value; - } - - fmt = fmt.replace("%D", "%m/%d/%y"); - fmt = fmt.replace("%r", "%I:%M:%S %p"); - fmt = fmt.replace("%Y", "" + d.getFullYear()); - fmt = fmt.replace("%y", "" + d.getYear()); - fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); - fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); - fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); - fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); - fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); - fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); - fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); - fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]); - fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]); - fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]); - fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]); - fmt = fmt.replace("%%", "%"); - - return fmt; - } - }); - - // Register plugin - tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/template/js/template.js b/plugins/TinyMCE/js/plugins/template/js/template.js deleted file mode 100644 index bc3045d244..0000000000 --- a/plugins/TinyMCE/js/plugins/template/js/template.js +++ /dev/null @@ -1,106 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var TemplateDialog = { - preInit : function() { - var url = tinyMCEPopup.getParam("template_external_list_url"); - - if (url != null) - document.write(''); - }, - - init : function() { - var ed = tinyMCEPopup.editor, tsrc, sel, x, u; - - tsrc = ed.getParam("template_templates", false); - sel = document.getElementById('tpath'); - - // Setup external template list - if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') { - for (x=0, tsrc = []; x'); - }); - }, - - selectTemplate : function(u, ti) { - var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc; - - if (!u) - return; - - d.body.innerHTML = this.templateHTML = this.getFileContents(u); - - for (x=0; x - - {#template_dlg.title} - - - - - -
    -
    -
    {#template_dlg.desc}
    -
    - -
    -
    -
    -
    - {#template_dlg.preview} - -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js deleted file mode 100644 index 1a148e8b4f..0000000000 --- a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js deleted file mode 100644 index df985905b6..0000000000 --- a/plugins/TinyMCE/js/plugins/visualchars/editor_plugin_src.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.VisualChars', { - init : function(ed, url) { - var t = this; - - t.editor = ed; - - // Register commands - ed.addCommand('mceVisualChars', t._toggleVisualChars, t); - - // Register buttons - ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'}); - - ed.onBeforeGetContent.add(function(ed, o) { - if (t.state && o.format != 'raw' && !o.draft) { - t.state = true; - t._toggleVisualChars(false); - } - }); - }, - - getInfo : function() { - return { - longname : 'Visual characters', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - }, - - // Private methods - - _toggleVisualChars : function(bookmark) { - var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm; - - t.state = !t.state; - ed.controlManager.setActive('visualchars', t.state); - - if (bookmark) - bm = s.getBookmark(); - - if (t.state) { - nl = []; - tinymce.walk(b, function(n) { - if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1) - nl.push(n); - }, 'childNodes'); - - for (i = 0; i < nl.length; i++) { - nv = nl[i].nodeValue; - nv = nv.replace(/(\u00a0)/g, '$1'); - - div = ed.dom.create('div', null, nv); - while (node = div.lastChild) - ed.dom.insertAfter(node, nl[i]); - - ed.dom.remove(nl[i]); - } - } else { - nl = ed.dom.select('span.mceItemNbsp', b); - - for (i = nl.length - 1; i >= 0; i--) - ed.dom.remove(nl[i], 1); - } - - s.moveToBookmark(bm); - } - }); - - // Register plugin - tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js deleted file mode 100644 index e769d09f6d..0000000000 --- a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(h,"span",{},'0')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},2000)},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js deleted file mode 100644 index 6c9a3ead27..0000000000 --- a/plugins/TinyMCE/js/plugins/wordcount/editor_plugin_src.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.WordCount', { - block : 0, - id : null, - countre : null, - cleanre : null, - - init : function(ed, url) { - var t = this, last = 0; - - t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’ - t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g); - t.id = ed.id + '-word-count'; - - ed.onPostRender.add(function(ed, cm) { - var row, id; - - // Add it to the specified id or the theme advanced path - id = ed.getParam('wordcount_target_id'); - if (!id) { - row = tinymce.DOM.get(ed.id + '_path_row'); - - if (row) - tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); - } else { - tinymce.DOM.add(id, 'span', {}, '0'); - } - }); - - ed.onInit.add(function(ed) { - ed.selection.onSetContent.add(function() { - t._count(ed); - }); - - t._count(ed); - }); - - ed.onSetContent.add(function(ed) { - t._count(ed); - }); - - ed.onKeyUp.add(function(ed, e) { - if (e.keyCode == last) - return; - - if (13 == e.keyCode || 8 == last || 46 == last) - t._count(ed); - - last = e.keyCode; - }); - }, - - _getCount : function(ed) { - var tc = 0; - var tx = ed.getContent({ format: 'raw' }); - - if (tx) { - tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces - tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars - - // deal with html entities - tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' '); - tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation - - var wordArray = tx.match(this.countre); - if (wordArray) { - tc = wordArray.length; - } - } - - return tc; - }, - - _count : function(ed) { - var t = this; - - // Keep multiple calls from happening at the same time - if (t.block) - return; - - t.block = 1; - - setTimeout(function() { - var tc = t._getCount(ed); - - tinymce.DOM.setHTML(t.id, tc.toString()); - - setTimeout(function() {t.block = 0;}, 2000); - }, 1); - }, - - getInfo: function() { - return { - longname : 'Word Count plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); -})(); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm deleted file mode 100644 index 30a894f7c3..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/abbr.htm +++ /dev/null @@ -1,142 +0,0 @@ - - - - {#xhtmlxtras_dlg.title_abbr_element} - - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    : - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm deleted file mode 100644 index c109345928..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/acronym.htm +++ /dev/null @@ -1,142 +0,0 @@ - - - - {#xhtmlxtras_dlg.title_acronym_element} - - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    : - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm deleted file mode 100644 index e8d606a340..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/attributes.htm +++ /dev/null @@ -1,149 +0,0 @@ - - - - {#xhtmlxtras_dlg.attribs_title} - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.attribute_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.attribute_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm deleted file mode 100644 index 0ac6bdb667..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/cite.htm +++ /dev/null @@ -1,142 +0,0 @@ - - - - {#xhtmlxtras_dlg.title_cite_element} - - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    : - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css deleted file mode 100644 index 9a6a235c35..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/attributes.css +++ /dev/null @@ -1,11 +0,0 @@ -.panel_wrapper div.current { - height: 290px; -} - -#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { - width: 200px; -} - -#events_panel input { - width: 200px; -} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css b/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css deleted file mode 100644 index e67114dbaa..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/css/popup.css +++ /dev/null @@ -1,9 +0,0 @@ -input.field, select.field {width:200px;} -input.picker {width:179px; margin-left: 5px;} -input.disabled {border-color:#F2F2F2;} -img.picker {vertical-align:text-bottom; cursor:pointer;} -h1 {padding: 0 0 5px 0;} -.panel_wrapper div.current {height:160px;} -#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} -a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} -#datetime {width:180px;} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm deleted file mode 100644 index 5f667510f5..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/del.htm +++ /dev/null @@ -1,162 +0,0 @@ - - - - {#xhtmlxtras_dlg.title_del_element} - - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_general_tab} - - - - - - - - - -
    : - - - - - -
    -
    :
    -
    -
    - {#xhtmlxtras_dlg.fieldset_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    : - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js deleted file mode 100644 index 9b98a5154b..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin.js +++ /dev/null @@ -1 +0,0 @@ -(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js deleted file mode 100644 index f24057211c..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/editor_plugin_src.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * editor_plugin_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', { - init : function(ed, url) { - // Register commands - ed.addCommand('mceCite', function() { - ed.windowManager.open({ - file : url + '/cite.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAcronym', function() { - ed.windowManager.open({ - file : url + '/acronym.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAbbr', function() { - ed.windowManager.open({ - file : url + '/abbr.htm', - width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), - height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceDel', function() { - ed.windowManager.open({ - file : url + '/del.htm', - width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceIns', function() { - ed.windowManager.open({ - file : url + '/ins.htm', - width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), - height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - ed.addCommand('mceAttributes', function() { - ed.windowManager.open({ - file : url + '/attributes.htm', - width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)), - height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)), - inline : 1 - }, { - plugin_url : url - }); - }); - - // Register buttons - ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); - ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); - ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); - ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); - ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); - ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); - - ed.onNodeChange.add(function(ed, cm, n, co) { - n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); - - cm.setDisabled('cite', co); - cm.setDisabled('acronym', co); - cm.setDisabled('abbr', co); - cm.setDisabled('del', co); - cm.setDisabled('ins', co); - cm.setDisabled('attribs', n && n.nodeName == 'BODY'); - cm.setActive('cite', 0); - cm.setActive('acronym', 0); - cm.setActive('abbr', 0); - cm.setActive('del', 0); - cm.setActive('ins', 0); - - // Activate all - if (n) { - do { - cm.setDisabled(n.nodeName.toLowerCase(), 0); - cm.setActive(n.nodeName.toLowerCase(), 1); - } while (n = n.parentNode); - } - }); - - ed.onPreInit.add(function() { - // Fixed IE issue where it can't handle these elements correctly - ed.dom.create('abbr'); - }); - }, - - getInfo : function() { - return { - longname : 'XHTML Xtras Plugin', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras', - version : tinymce.majorVersion + "." + tinymce.minorVersion - }; - } - }); - - // Register plugin - tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm b/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm deleted file mode 100644 index d001ac7c4d..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/ins.htm +++ /dev/null @@ -1,162 +0,0 @@ - - - - {#xhtmlxtras_dlg.title_ins_element} - - - - - - - - - - -
    - - -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_general_tab} - - - - - - - - - -
    : - - - - - -
    -
    :
    -
    -
    - {#xhtmlxtras_dlg.fieldset_attrib_tab} - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    : - -
    :
    : - -
    : - -
    -
    -
    -
    -
    - {#xhtmlxtras_dlg.fieldset_events_tab} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    :
    -
    -
    -
    -
    - - - -
    -
    - - diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js deleted file mode 100644 index 4b51a25721..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/abbr.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * abbr.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('abbr'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertAbbr() { - SXE.insertElement('abbr'); - tinyMCEPopup.close(); -} - -function removeAbbr() { - SXE.removeElement('abbr'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js deleted file mode 100644 index 6ec2f88716..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/acronym.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * acronym.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('acronym'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertAcronym() { - SXE.insertElement('acronym'); - tinyMCEPopup.close(); -} - -function removeAcronym() { - SXE.removeElement('acronym'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js deleted file mode 100644 index 9c99995adb..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/attributes.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * attributes.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - tinyMCEPopup.resizeToInnerSize(); - var inst = tinyMCEPopup.editor; - var dom = inst.dom; - var elm = inst.selection.getNode(); - var f = document.forms[0]; - var onclick = dom.getAttrib(elm, 'onclick'); - - setFormValue('title', dom.getAttrib(elm, 'title')); - setFormValue('id', dom.getAttrib(elm, 'id')); - setFormValue('style', dom.getAttrib(elm, "style")); - setFormValue('dir', dom.getAttrib(elm, 'dir')); - setFormValue('lang', dom.getAttrib(elm, 'lang')); - setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); - setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); - setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); - setFormValue('onblur', dom.getAttrib(elm, 'onblur')); - setFormValue('onclick', onclick); - setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); - setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); - setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); - setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); - setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); - setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); - setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); - setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); - setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); - className = dom.getAttrib(elm, 'class'); - - addClassesToList('classlist', 'advlink_styles'); - selectByValue(f, 'classlist', className, true); - - TinyMCE_EditableSelects.init(); -} - -function setFormValue(name, value) { - if(value && document.forms[0].elements[name]){ - document.forms[0].elements[name].value = value; - } -} - -function insertAction() { - var inst = tinyMCEPopup.editor; - var elm = inst.selection.getNode(); - - setAllAttribs(elm); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); -} - -function setAttrib(elm, attrib, value) { - var formObj = document.forms[0]; - var valueElm = formObj.elements[attrib.toLowerCase()]; - var inst = tinyMCEPopup.editor; - var dom = inst.dom; - - if (typeof(value) == "undefined" || value == null) { - value = ""; - - if (valueElm) - value = valueElm.value; - } - - dom.setAttrib(elm, attrib.toLowerCase(), value); -} - -function setAllAttribs(elm) { - var f = document.forms[0]; - - setAttrib(elm, 'title'); - setAttrib(elm, 'id'); - setAttrib(elm, 'style'); - setAttrib(elm, 'class', getSelectValue(f, 'classlist')); - setAttrib(elm, 'dir'); - setAttrib(elm, 'lang'); - setAttrib(elm, 'tabindex'); - setAttrib(elm, 'accesskey'); - setAttrib(elm, 'onfocus'); - setAttrib(elm, 'onblur'); - setAttrib(elm, 'onclick'); - setAttrib(elm, 'ondblclick'); - setAttrib(elm, 'onmousedown'); - setAttrib(elm, 'onmouseup'); - setAttrib(elm, 'onmouseover'); - setAttrib(elm, 'onmousemove'); - setAttrib(elm, 'onmouseout'); - setAttrib(elm, 'onkeypress'); - setAttrib(elm, 'onkeydown'); - setAttrib(elm, 'onkeyup'); - - // Refresh in old MSIE -// if (tinyMCE.isMSIE5) -// elm.outerHTML = elm.outerHTML; -} - -function insertAttribute() { - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); -tinyMCEPopup.requireLangPack(); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js deleted file mode 100644 index 009b71546a..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/cite.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * cite.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('cite'); - if (SXE.currentAction == "update") { - SXE.showRemoveButton(); - } -} - -function insertCite() { - SXE.insertElement('cite'); - tinyMCEPopup.close(); -} - -function removeCite() { - SXE.removeElement('cite'); - tinyMCEPopup.close(); -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js deleted file mode 100644 index 1f957dc786..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/del.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * del.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('del'); - if (SXE.currentAction == "update") { - setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); - setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); - SXE.showRemoveButton(); - } -} - -function setElementAttribs(elm) { - setAllCommonAttribs(elm); - setAttrib(elm, 'datetime'); - setAttrib(elm, 'cite'); - elm.removeAttribute('data-mce-new'); -} - -function insertDel() { - var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); - - if (elm == null) { - var s = SXE.inst.selection.getContent(); - if(s.length > 0) { - insertInlineElement('del'); - var elementArray = SXE.inst.dom.select('del[data-mce-new]'); - for (var i=0; i 0) { - tagName = element_name; - - insertInlineElement(element_name); - var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); - for (var i=0; i -1) ? true : false; -} - -SXE.removeClass = function(elm,cl) { - if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { - return true; - } - var classNames = elm.className.split(" "); - var newClassNames = ""; - for (var x = 0, cnl = classNames.length; x < cnl; x++) { - if (classNames[x] != cl) { - newClassNames += (classNames[x] + " "); - } - } - elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end -} - -SXE.addClass = function(elm,cl) { - if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; - return true; -} - -function insertInlineElement(en) { - var ed = tinyMCEPopup.editor, dom = ed.dom; - - ed.getDoc().execCommand('FontName', false, 'mceinline'); - tinymce.each(dom.select('span,font'), function(n) { - if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') - dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1); - }); -} diff --git a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js b/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js deleted file mode 100644 index c4addfb01d..0000000000 --- a/plugins/TinyMCE/js/plugins/xhtmlxtras/js/ins.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * ins.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -function init() { - SXE.initElementDialog('ins'); - if (SXE.currentAction == "update") { - setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); - setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); - SXE.showRemoveButton(); - } -} - -function setElementAttribs(elm) { - setAllCommonAttribs(elm); - setAttrib(elm, 'datetime'); - setAttrib(elm, 'cite'); - elm.removeAttribute('data-mce-new'); -} - -function insertIns() { - var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); - - if (elm == null) { - var s = SXE.inst.selection.getContent(); - if(s.length > 0) { - insertInlineElement('ins'); - var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); - for (var i=0; i - - - {#advanced_dlg.about_title} - - - - - - - -
    -
    -

    {#advanced_dlg.about_title}

    -

    Version: ()

    -

    TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL - by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

    -

    Copyright © 2003-2008, Moxiecode Systems AB, All rights reserved.

    -

    For more information about this software visit the TinyMCE website.

    - -
    - Got Moxie? -
    -
    - -
    -
    -

    {#advanced_dlg.about_loaded}

    - -
    -
    - -

     

    -
    -
    - -
    -
    -
    -
    - -
    - -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/anchor.htm b/plugins/TinyMCE/js/themes/advanced/anchor.htm deleted file mode 100644 index 75c93b799b..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/anchor.htm +++ /dev/null @@ -1,26 +0,0 @@ - - - - {#advanced_dlg.anchor_title} - - - - -
    - - - - - - - - -
    {#advanced_dlg.anchor_title}
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/charmap.htm b/plugins/TinyMCE/js/themes/advanced/charmap.htm deleted file mode 100644 index 2c3b3f27bd..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/charmap.htm +++ /dev/null @@ -1,51 +0,0 @@ - - - - {#advanced_dlg.charmap_title} - - - - - - - - - - - - - - - -
    - - - - - - - - - -
     
     
    -
    - - - - - - - - - - - - - - - - -
     
     
     
    -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/color_picker.htm b/plugins/TinyMCE/js/themes/advanced/color_picker.htm deleted file mode 100644 index ad1bb0f6cc..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/color_picker.htm +++ /dev/null @@ -1,74 +0,0 @@ - - - - {#advanced_dlg.colorpicker_title} - - - - - - -
    - - -
    -
    -
    - {#advanced_dlg.colorpicker_picker_title} -
    - - -
    - -
    - -
    -
    -
    -
    - -
    -
    - {#advanced_dlg.colorpicker_palette_title} -
    - -
    - -
    -
    -
    - -
    -
    - {#advanced_dlg.colorpicker_named_title} -
    - -
    - -
    - -
    - {#advanced_dlg.colorpicker_name} -
    -
    -
    -
    - -
    - - -
    - -
    - -
    -
    -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/editor_template.js b/plugins/TinyMCE/js/themes/advanced/editor_template.js deleted file mode 100644 index 57e7184a83..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/editor_template.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},""),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){window.focus();v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{}," ")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager,k=j.undoManager;i.setDisabled("undo",!k.hasUndo()&&!k.typing);i.setDisabled("redo",!k.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/editor_template_src.js b/plugins/TinyMCE/js/themes/advanced/editor_template_src.js deleted file mode 100644 index d62f497e61..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/editor_template_src.js +++ /dev/null @@ -1,1358 +0,0 @@ -/** - * editor_template_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function(tinymce) { - var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; - - // Tell it to load theme specific language pack(s) - tinymce.ThemeManager.requireLangPack('advanced'); - - tinymce.create('tinymce.themes.AdvancedTheme', { - sizes : [8, 10, 12, 14, 18, 24, 36], - - // Control name lookup, format: title, command - controls : { - bold : ['bold_desc', 'Bold'], - italic : ['italic_desc', 'Italic'], - underline : ['underline_desc', 'Underline'], - strikethrough : ['striketrough_desc', 'Strikethrough'], - justifyleft : ['justifyleft_desc', 'JustifyLeft'], - justifycenter : ['justifycenter_desc', 'JustifyCenter'], - justifyright : ['justifyright_desc', 'JustifyRight'], - justifyfull : ['justifyfull_desc', 'JustifyFull'], - bullist : ['bullist_desc', 'InsertUnorderedList'], - numlist : ['numlist_desc', 'InsertOrderedList'], - outdent : ['outdent_desc', 'Outdent'], - indent : ['indent_desc', 'Indent'], - cut : ['cut_desc', 'Cut'], - copy : ['copy_desc', 'Copy'], - paste : ['paste_desc', 'Paste'], - undo : ['undo_desc', 'Undo'], - redo : ['redo_desc', 'Redo'], - link : ['link_desc', 'mceLink'], - unlink : ['unlink_desc', 'unlink'], - image : ['image_desc', 'mceImage'], - cleanup : ['cleanup_desc', 'mceCleanup'], - help : ['help_desc', 'mceHelp'], - code : ['code_desc', 'mceCodeEditor'], - hr : ['hr_desc', 'InsertHorizontalRule'], - removeformat : ['removeformat_desc', 'RemoveFormat'], - sub : ['sub_desc', 'subscript'], - sup : ['sup_desc', 'superscript'], - forecolor : ['forecolor_desc', 'ForeColor'], - forecolorpicker : ['forecolor_desc', 'mceForeColor'], - backcolor : ['backcolor_desc', 'HiliteColor'], - backcolorpicker : ['backcolor_desc', 'mceBackColor'], - charmap : ['charmap_desc', 'mceCharMap'], - visualaid : ['visualaid_desc', 'mceToggleVisualAid'], - anchor : ['anchor_desc', 'mceInsertAnchor'], - newdocument : ['newdocument_desc', 'mceNewDocument'], - blockquote : ['blockquote_desc', 'mceBlockQuote'] - }, - - stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], - - init : function(ed, url) { - var t = this, s, v, o; - - t.editor = ed; - t.url = url; - t.onResolveName = new tinymce.util.Dispatcher(this); - - ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); - ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; - - // Default settings - t.settings = s = extend({ - theme_advanced_path : true, - theme_advanced_toolbar_location : 'bottom', - theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", - theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", - theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap", - theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", - theme_advanced_toolbar_align : "center", - theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", - theme_advanced_more_colors : 1, - theme_advanced_row_height : 23, - theme_advanced_resize_horizontal : 1, - theme_advanced_resizing_use_cookie : 1, - theme_advanced_font_sizes : "1,2,3,4,5,6,7", - theme_advanced_font_selector : "span", - theme_advanced_show_current_color: 0, - readonly : ed.settings.readonly - }, ed.settings); - - // Setup default font_size_style_values - if (!s.font_size_style_values) - s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; - - if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { - s.font_size_style_values = tinymce.explode(s.font_size_style_values); - s.font_size_classes = tinymce.explode(s.font_size_classes || ''); - - // Parse string value - o = {}; - ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; - each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { - var cl; - - if (k == v && v >= 1 && v <= 7) { - k = v + ' (' + t.sizes[v - 1] + 'pt)'; - cl = s.font_size_classes[v - 1]; - v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); - } - - if (/^\s*\./.test(v)) - cl = v.replace(/\./g, ''); - - o[k] = cl ? {'class' : cl} : {fontSize : v}; - }); - - s.theme_advanced_font_sizes = o; - } - - if ((v = s.theme_advanced_path_location) && v != 'none') - s.theme_advanced_statusbar_location = s.theme_advanced_path_location; - - if (s.theme_advanced_statusbar_location == 'none') - s.theme_advanced_statusbar_location = 0; - - if (ed.settings.content_css !== false) - ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); - - // Init editor - ed.onInit.add(function() { - if (!ed.settings.readonly) { - ed.onNodeChange.add(t._nodeChanged, t); - ed.onKeyUp.add(t._updateUndoStatus, t); - ed.onMouseUp.add(t._updateUndoStatus, t); - ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { - t._updateUndoStatus(ed); - }); - } - }); - - ed.onSetProgressState.add(function(ed, b, ti) { - var co, id = ed.id, tb; - - if (b) { - t.progressTimer = setTimeout(function() { - co = ed.getContainer(); - co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); - tb = DOM.get(ed.id + '_tbl'); - - DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); - DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); - }, ti || 0); - } else { - DOM.remove(id + '_blocker'); - DOM.remove(id + '_progress'); - clearTimeout(t.progressTimer); - } - }); - - DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); - - if (s.skin_variant) - DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); - }, - - _isHighContrast : function() { - var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); - - actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); - DOM.remove(div); - - return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; - }, - - createControl : function(n, cf) { - var cd, c; - - if (c = cf.createControl(n)) - return c; - - switch (n) { - case "styleselect": - return this._createStyleSelect(); - - case "formatselect": - return this._createBlockFormats(); - - case "fontselect": - return this._createFontSelect(); - - case "fontsizeselect": - return this._createFontSizeSelect(); - - case "forecolor": - return this._createForeColorMenu(); - - case "backcolor": - return this._createBackColorMenu(); - } - - if ((cd = this.controls[n])) - return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); - }, - - execCommand : function(cmd, ui, val) { - var f = this['_' + cmd]; - - if (f) { - f.call(this, ui, val); - return true; - } - - return false; - }, - - _importClasses : function(e) { - var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); - - if (ctrl.getLength() == 0) { - each(ed.dom.getClasses(), function(o, idx) { - var name = 'style_' + idx; - - ed.formatter.register(name, { - inline : 'span', - attributes : {'class' : o['class']}, - selector : '*' - }); - - ctrl.add(o['class'], name); - }); - } - }, - - _createStyleSelect : function(n) { - var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; - - // Setup style select box - ctrl = ctrlMan.createListBox('styleselect', { - title : 'advanced.style_select', - onselect : function(name) { - var matches, formatNames = []; - - each(ctrl.items, function(item) { - formatNames.push(item.value); - }); - - ed.focus(); - ed.undoManager.add(); - - // Toggle off the current format - matches = ed.formatter.matchAll(formatNames); - if (!name || matches[0] == name) { - if (matches[0]) - ed.formatter.remove(matches[0]); - } else - ed.formatter.apply(name); - - ed.undoManager.add(); - ed.nodeChanged(); - - return false; // No auto select - } - }); - - // Handle specified format - ed.onInit.add(function() { - var counter = 0, formats = ed.getParam('style_formats'); - - if (formats) { - each(formats, function(fmt) { - var name, keys = 0; - - each(fmt, function() {keys++;}); - - if (keys > 1) { - name = fmt.name = fmt.name || 'style_' + (counter++); - ed.formatter.register(name, fmt); - ctrl.add(fmt.title, name); - } else - ctrl.add(fmt.title); - }); - } else { - each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { - var name; - - if (val) { - name = 'style_' + (counter++); - - ed.formatter.register(name, { - inline : 'span', - classes : val, - selector : '*' - }); - - ctrl.add(t.editor.translate(key), name); - } - }); - } - }); - - // Auto import classes if the ctrl box is empty - if (ctrl.getLength() == 0) { - ctrl.onPostRender.add(function(ed, n) { - if (!ctrl.NativeListBox) { - Event.add(n.id + '_text', 'focus', t._importClasses, t); - Event.add(n.id + '_text', 'mousedown', t._importClasses, t); - Event.add(n.id + '_open', 'focus', t._importClasses, t); - Event.add(n.id + '_open', 'mousedown', t._importClasses, t); - } else - Event.add(n.id, 'focus', t._importClasses, t); - }); - } - - return ctrl; - }, - - _createFontSelect : function() { - var c, t = this, ed = t.editor; - - c = ed.controlManager.createListBox('fontselect', { - title : 'advanced.fontdefault', - onselect : function(v) { - var cur = c.items[c.selectedIndex]; - - if (!v && cur) { - ed.execCommand('FontName', false, cur.value); - return; - } - - ed.execCommand('FontName', false, v); - - // Fake selection, execCommand will fire a nodeChange and update the selection - c.select(function(sv) { - return v == sv; - }); - - if (cur && cur.value == v) { - c.select(null); - } - - return false; // No auto select - } - }); - - if (c) { - each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { - c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); - }); - } - - return c; - }, - - _createFontSizeSelect : function() { - var t = this, ed = t.editor, c, i = 0, cl = []; - - c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { - var cur = c.items[c.selectedIndex]; - - if (!v && cur) { - cur = cur.value; - - if (cur['class']) { - ed.formatter.toggle('fontsize_class', {value : cur['class']}); - ed.undoManager.add(); - ed.nodeChanged(); - } else { - ed.execCommand('FontSize', false, cur.fontSize); - } - - return; - } - - if (v['class']) { - ed.focus(); - ed.undoManager.add(); - ed.formatter.toggle('fontsize_class', {value : v['class']}); - ed.undoManager.add(); - ed.nodeChanged(); - } else - ed.execCommand('FontSize', false, v.fontSize); - - // Fake selection, execCommand will fire a nodeChange and update the selection - c.select(function(sv) { - return v == sv; - }); - - if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) { - c.select(null); - } - - return false; // No auto select - }}); - - if (c) { - each(t.settings.theme_advanced_font_sizes, function(v, k) { - var fz = v.fontSize; - - if (fz >= 1 && fz <= 7) - fz = t.sizes[parseInt(fz) - 1] + 'pt'; - - c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); - }); - } - - return c; - }, - - _createBlockFormats : function() { - var c, fmts = { - p : 'advanced.paragraph', - address : 'advanced.address', - pre : 'advanced.pre', - h1 : 'advanced.h1', - h2 : 'advanced.h2', - h3 : 'advanced.h3', - h4 : 'advanced.h4', - h5 : 'advanced.h5', - h6 : 'advanced.h6', - div : 'advanced.div', - blockquote : 'advanced.blockquote', - code : 'advanced.code', - dt : 'advanced.dt', - dd : 'advanced.dd', - samp : 'advanced.samp' - }, t = this; - - c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { - t.editor.execCommand('FormatBlock', false, v); - return false; - }}); - - if (c) { - each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { - c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); - }); - } - - return c; - }, - - _createForeColorMenu : function() { - var c, t = this, s = t.settings, o = {}, v; - - if (s.theme_advanced_more_colors) { - o.more_colors_func = function() { - t._mceColorPicker(0, { - color : c.value, - func : function(co) { - c.setColor(co); - } - }); - }; - } - - if (v = s.theme_advanced_text_colors) - o.colors = v; - - if (s.theme_advanced_default_foreground_color) - o.default_color = s.theme_advanced_default_foreground_color; - - o.title = 'advanced.forecolor_desc'; - o.cmd = 'ForeColor'; - o.scope = this; - - c = t.editor.controlManager.createColorSplitButton('forecolor', o); - - return c; - }, - - _createBackColorMenu : function() { - var c, t = this, s = t.settings, o = {}, v; - - if (s.theme_advanced_more_colors) { - o.more_colors_func = function() { - t._mceColorPicker(0, { - color : c.value, - func : function(co) { - c.setColor(co); - } - }); - }; - } - - if (v = s.theme_advanced_background_colors) - o.colors = v; - - if (s.theme_advanced_default_background_color) - o.default_color = s.theme_advanced_default_background_color; - - o.title = 'advanced.backcolor_desc'; - o.cmd = 'HiliteColor'; - o.scope = this; - - c = t.editor.controlManager.createColorSplitButton('backcolor', o); - - return c; - }, - - renderUI : function(o) { - var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; - - if (ed.settings) { - ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); - } - - // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. - // Maybe actually inherit it from the original textara? - n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); - DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); - - if (!DOM.boxModel) - n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); - - n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); - n = tb = DOM.add(n, 'tbody'); - - switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { - case "rowlayout": - ic = t._rowLayout(s, tb, o); - break; - - case "customlayout": - ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); - break; - - default: - ic = t._simpleLayout(s, tb, o, p); - } - - n = o.targetNode; - - // Add classes to first and last TRs - nl = sc.rows; - DOM.addClass(nl[0], 'mceFirst'); - DOM.addClass(nl[nl.length - 1], 'mceLast'); - - // Add classes to first and last TDs - each(DOM.select('tr', tb), function(n) { - DOM.addClass(n.firstChild, 'mceFirst'); - DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); - }); - - if (DOM.get(s.theme_advanced_toolbar_container)) - DOM.get(s.theme_advanced_toolbar_container).appendChild(p); - else - DOM.insertAfter(p, n); - - Event.add(ed.id + '_path_row', 'click', function(e) { - e = e.target; - - if (e.nodeName == 'A') { - t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); - - return Event.cancel(e); - } - }); -/* - if (DOM.get(ed.id + '_path_row')) { - Event.add(ed.id + '_tbl', 'mouseover', function(e) { - var re; - - e = e.target; - - if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { - re = DOM.get(ed.id + '_path_row'); - t.lastPath = re.innerHTML; - DOM.setHTML(re, e.parentNode.title); - } - }); - - Event.add(ed.id + '_tbl', 'mouseout', function(e) { - if (t.lastPath) { - DOM.setHTML(ed.id + '_path_row', t.lastPath); - t.lastPath = 0; - } - }); - } -*/ - - if (!ed.getParam('accessibility_focus')) - Event.add(DOM.add(p, 'a', {href : '#'}, ''), 'focus', function() {tinyMCE.get(ed.id).focus();}); - - if (s.theme_advanced_toolbar_location == 'external') - o.deltaHeight = 0; - - t.deltaHeight = o.deltaHeight; - o.targetNode = null; - - ed.onKeyDown.add(function(ed, evt) { - var DOM_VK_F10 = 121, DOM_VK_F11 = 122; - - if (evt.altKey) { - if (evt.keyCode === DOM_VK_F10) { - window.focus(); - t.toolbarGroup.focus(); - return Event.cancel(evt); - } else if (evt.keyCode === DOM_VK_F11) { - DOM.get(ed.id + '_path_row').focus(); - return Event.cancel(evt); - } - } - }); - - // alt+0 is the UK recommended shortcut for accessing the list of access controls. - ed.addShortcut('alt+0', '', 'mceShortcuts', t); - - return { - iframeContainer : ic, - editorContainer : ed.id + '_parent', - sizeContainer : sc, - deltaHeight : o.deltaHeight - }; - }, - - getInfo : function() { - return { - longname : 'Advanced theme', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - version : tinymce.majorVersion + "." + tinymce.minorVersion - } - }, - - resizeBy : function(dw, dh) { - var e = DOM.get(this.editor.id + '_ifr'); - - this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); - }, - - resizeTo : function(w, h, store) { - var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); - - // Boundery fix box - w = Math.max(s.theme_advanced_resizing_min_width || 100, w); - h = Math.max(s.theme_advanced_resizing_min_height || 100, h); - w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); - h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); - - // Resize iframe and container - DOM.setStyle(e, 'height', ''); - DOM.setStyle(ifr, 'height', h); - - if (s.theme_advanced_resize_horizontal) { - DOM.setStyle(e, 'width', ''); - DOM.setStyle(ifr, 'width', w); - - // Make sure that the size is never smaller than the over all ui - if (w < e.clientWidth) { - w = e.clientWidth; - DOM.setStyle(ifr, 'width', e.clientWidth); - } - } - - // Store away the size - if (store && s.theme_advanced_resizing_use_cookie) { - Cookie.setHash("TinyMCE_" + ed.id + "_size", { - cw : w, - ch : h - }); - } - }, - - destroy : function() { - var id = this.editor.id; - - Event.clear(id + '_resize'); - Event.clear(id + '_path_row'); - Event.clear(id + '_external_close'); - }, - - // Internal functions - - _simpleLayout : function(s, tb, o, p) { - var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; - - if (s.readonly) { - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - return ic; - } - - // Create toolbar container at top - if (lo == 'top') - t._addToolbars(tb, o); - - // Create external toolbar - if (lo == 'external') { - n = c = DOM.create('div', {style : 'position:relative'}); - n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); - DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); - n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); - etb = DOM.add(n, 'tbody'); - - if (p.firstChild.className == 'mceOldBoxModel') - p.firstChild.appendChild(c); - else - p.insertBefore(c, p.firstChild); - - t._addToolbars(etb, o); - - ed.onMouseUp.add(function() { - var e = DOM.get(ed.id + '_external'); - DOM.show(e); - - DOM.hide(lastExtID); - - var f = Event.add(ed.id + '_external_close', 'click', function() { - DOM.hide(ed.id + '_external'); - Event.remove(ed.id + '_external_close', 'click', f); - }); - - DOM.show(e); - DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); - - // Fixes IE rendering bug - DOM.hide(e); - DOM.show(e); - e.style.filter = ''; - - lastExtID = ed.id + '_external'; - - e = null; - }); - } - - if (sl == 'top') - t._addStatusBar(tb, o); - - // Create iframe container - if (!s.theme_advanced_toolbar_container) { - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - } - - // Create toolbar container at bottom - if (lo == 'bottom') - t._addToolbars(tb, o); - - if (sl == 'bottom') - t._addStatusBar(tb, o); - - return ic; - }, - - _rowLayout : function(s, tb, o) { - var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; - - dc = s.theme_advanced_containers_default_class || ''; - da = s.theme_advanced_containers_default_align || 'center'; - - each(explode(s.theme_advanced_containers || ''), function(c, i) { - var v = s['theme_advanced_container_' + c] || ''; - - switch (c.toLowerCase()) { - case 'mceeditor': - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); - break; - - case 'mceelementpath': - t._addStatusBar(tb, o); - break; - - default: - a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); - a = 'mce' + t._ufirst(a); - - n = DOM.add(DOM.add(tb, 'tr'), 'td', { - 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da - }); - - to = cf.createToolbar("toolbar" + i); - t._addControls(v, to); - DOM.setHTML(n, to.renderHTML()); - o.deltaHeight -= s.theme_advanced_row_height; - } - }); - - return ic; - }, - - _addControls : function(v, tb) { - var t = this, s = t.settings, di, cf = t.editor.controlManager; - - if (s.theme_advanced_disable && !t._disabled) { - di = {}; - - each(explode(s.theme_advanced_disable), function(v) { - di[v] = 1; - }); - - t._disabled = di; - } else - di = t._disabled; - - each(explode(v), function(n) { - var c; - - if (di && di[n]) - return; - - // Compatiblity with 2.x - if (n == 'tablecontrols') { - each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { - n = t.createControl(n, cf); - - if (n) - tb.add(n); - }); - - return; - } - - c = t.createControl(n, cf); - - if (c) - tb.add(c); - }); - }, - - _addToolbars : function(c, o) { - var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup; - - toolbarGroup = cf.createToolbarGroup('toolbargroup', { - 'name': ed.getLang('advanced.toolbar'), - 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') - }); - - t.toolbarGroup = toolbarGroup; - - a = s.theme_advanced_toolbar_align.toLowerCase(); - a = 'mce' + t._ufirst(a); - - n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"}); - - // Create toolbar and add the controls - for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { - tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); - - if (s['theme_advanced_buttons' + i + '_add']) - v += ',' + s['theme_advanced_buttons' + i + '_add']; - - if (s['theme_advanced_buttons' + i + '_add_before']) - v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; - - t._addControls(v, tb); - toolbarGroup.add(tb); - - o.deltaHeight -= s.theme_advanced_row_height; - } - h.push(toolbarGroup.renderHTML()); - h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '')); - DOM.setHTML(n, h.join('')); - }, - - _addStatusBar : function(tb, o) { - var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; - - n = DOM.add(tb, 'tr'); - n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); - n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); - if (s.theme_advanced_path) { - DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); - DOM.add(n, 'span', {}, ': '); - } else { - DOM.add(n, 'span', {}, ' '); - } - - - if (s.theme_advanced_resizing) { - DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); - - if (s.theme_advanced_resizing_use_cookie) { - ed.onPostRender.add(function() { - var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); - - if (!o) - return; - - t.resizeTo(o.cw, o.ch); - }); - } - - ed.onPostRender.add(function() { - Event.add(ed.id + '_resize', 'click', function(e) { - e.preventDefault(); - }); - - Event.add(ed.id + '_resize', 'mousedown', function(e) { - var mouseMoveHandler1, mouseMoveHandler2, - mouseUpHandler1, mouseUpHandler2, - startX, startY, startWidth, startHeight, width, height, ifrElm; - - function resizeOnMove(e) { - e.preventDefault(); - - width = startWidth + (e.screenX - startX); - height = startHeight + (e.screenY - startY); - - t.resizeTo(width, height); - }; - - function endResize(e) { - // Stop listening - Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); - Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); - Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); - Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); - - width = startWidth + (e.screenX - startX); - height = startHeight + (e.screenY - startY); - t.resizeTo(width, height, true); - }; - - e.preventDefault(); - - // Get the current rect size - startX = e.screenX; - startY = e.screenY; - ifrElm = DOM.get(t.editor.id + '_ifr'); - startWidth = width = ifrElm.clientWidth; - startHeight = height = ifrElm.clientHeight; - - // Register envent handlers - mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); - mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); - mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); - mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); - }); - }); - } - - o.deltaHeight -= 21; - n = tb = null; - }, - - _updateUndoStatus : function(ed) { - var cm = ed.controlManager, um = ed.undoManager; - - cm.setDisabled('undo', !um.hasUndo() && !um.typing); - cm.setDisabled('redo', !um.hasRedo()); - }, - - _nodeChanged : function(ed, cm, n, co, ob) { - var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; - - tinymce.each(t.stateControls, function(c) { - cm.setActive(c, ed.queryCommandState(t.controls[c][1])); - }); - - function getParent(name) { - var i, parents = ob.parents, func = name; - - if (typeof(name) == 'string') { - func = function(node) { - return node.nodeName == name; - }; - } - - for (i = 0; i < parents.length; i++) { - if (func(parents[i])) - return parents[i]; - } - }; - - cm.setActive('visualaid', ed.hasVisual); - t._updateUndoStatus(ed); - cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); - - p = getParent('A'); - if (c = cm.get('link')) { - if (!p || !p.name) { - c.setDisabled(!p && co); - c.setActive(!!p); - } - } - - if (c = cm.get('unlink')) { - c.setDisabled(!p && co); - c.setActive(!!p && !p.name); - } - - if (c = cm.get('anchor')) { - c.setActive(!co && !!p && p.name); - } - - p = getParent('IMG'); - if (c = cm.get('image')) - c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); - - if (c = cm.get('styleselect')) { - t._importClasses(); - - formatNames = []; - each(c.items, function(item) { - formatNames.push(item.value); - }); - - matches = ed.formatter.matchAll(formatNames); - c.select(matches[0]); - } - - if (c = cm.get('formatselect')) { - p = getParent(DOM.isBlock); - - if (p) - c.select(p.nodeName.toLowerCase()); - } - - // Find out current fontSize, fontFamily and fontClass - getParent(function(n) { - if (n.nodeName === 'SPAN') { - if (!cl && n.className) - cl = n.className; - } - - if (ed.dom.is(n, s.theme_advanced_font_selector)) { - if (!fz && n.style.fontSize) - fz = n.style.fontSize; - - if (!fn && n.style.fontFamily) - fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); - - if (!fc && n.style.color) - fc = n.style.color; - - if (!bc && n.style.backgroundColor) - bc = n.style.backgroundColor; - } - - return false; - }); - - if (c = cm.get('fontselect')) { - c.select(function(v) { - return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; - }); - } - - // Select font size - if (c = cm.get('fontsizeselect')) { - // Use computed style - if (s.theme_advanced_runtime_fontsize && !fz && !cl) - fz = ed.dom.getStyle(n, 'fontSize', true); - - c.select(function(v) { - if (v.fontSize && v.fontSize === fz) - return true; - - if (v['class'] && v['class'] === cl) - return true; - }); - } - - if (s.theme_advanced_show_current_color) { - function updateColor(controlId, color) { - if (c = cm.get(controlId)) { - if (!color) - color = c.settings.default_color; - if (color !== c.value) { - c.displayColor(color); - } - } - } - updateColor('forecolor', fc); - updateColor('backcolor', bc); - } - - if (s.theme_advanced_show_current_color) { - function updateColor(controlId, color) { - if (c = cm.get(controlId)) { - if (!color) - color = c.settings.default_color; - if (color !== c.value) { - c.displayColor(color); - } - } - }; - - updateColor('forecolor', fc); - updateColor('backcolor', bc); - } - - if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { - p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); - - if (t.statusKeyboardNavigation) { - t.statusKeyboardNavigation.destroy(); - t.statusKeyboardNavigation = null; - } - - DOM.setHTML(p, ''); - - getParent(function(n) { - var na = n.nodeName.toLowerCase(), u, pi, ti = ''; - - // Ignore non element and bogus/hidden elements - if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')) - return; - - // Handle prefix - if (tinymce.isIE && n.scopeName !== 'HTML') - na = n.scopeName + ':' + na; - - // Remove internal prefix - na = na.replace(/mce\:/g, ''); - - // Handle node name - switch (na) { - case 'b': - na = 'strong'; - break; - - case 'i': - na = 'em'; - break; - - case 'img': - if (v = DOM.getAttrib(n, 'src')) - ti += 'src: ' + v + ' '; - - break; - - case 'a': - if (v = DOM.getAttrib(n, 'name')) { - ti += 'name: ' + v + ' '; - na += '#' + v; - } - - if (v = DOM.getAttrib(n, 'href')) - ti += 'href: ' + v + ' '; - - break; - - case 'font': - if (v = DOM.getAttrib(n, 'face')) - ti += 'font: ' + v + ' '; - - if (v = DOM.getAttrib(n, 'size')) - ti += 'size: ' + v + ' '; - - if (v = DOM.getAttrib(n, 'color')) - ti += 'color: ' + v + ' '; - - break; - - case 'span': - if (v = DOM.getAttrib(n, 'style')) - ti += 'style: ' + v + ' '; - - break; - } - - if (v = DOM.getAttrib(n, 'id')) - ti += 'id: ' + v + ' '; - - if (v = n.className) { - v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') - - if (v) { - ti += 'class: ' + v + ' '; - - if (DOM.isBlock(n) || na == 'img' || na == 'span') - na += '.' + v; - } - } - - na = na.replace(/(html:)/g, ''); - na = {name : na, node : n, title : ti}; - t.onResolveName.dispatch(t, na); - ti = na.title; - na = na.name; - - //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; - pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); - - if (p.hasChildNodes()) { - p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); - p.insertBefore(pi, p.firstChild); - } else - p.appendChild(pi); - }, ed.getBody()); - - if (DOM.select('a', p).length > 0) { - t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ - root: ed.id + "_path_row", - items: DOM.select('a', p), - excludeFromTabOrder: true, - onCancel: function() { - ed.focus(); - } - }, DOM); - } - } - }, - - // Commands gets called by execCommand - - _sel : function(v) { - this.editor.execCommand('mceSelectNodeDepth', false, v); - }, - - _mceInsertAnchor : function(ui, v) { - var ed = this.editor; - - ed.windowManager.open({ - url : this.url + '/anchor.htm', - width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), - height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceCharMap : function() { - var ed = this.editor; - - ed.windowManager.open({ - url : this.url + '/charmap.htm', - width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), - height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceHelp : function() { - var ed = this.editor; - - ed.windowManager.open({ - url : this.url + '/about.htm', - width : 480, - height : 380, - inline : true - }, { - theme_url : this.url - }); - }, - - _mceShortcuts : function() { - var ed = this.editor; - ed.windowManager.open({ - url: this.url + '/shortcuts.htm', - width: 480, - height: 380, - inline: true - }, { - theme_url: this.url - }); - }, - - _mceColorPicker : function(u, v) { - var ed = this.editor; - - v = v || {}; - - ed.windowManager.open({ - url : this.url + '/color_picker.htm', - width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), - height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), - close_previous : false, - inline : true - }, { - input_color : v.color, - func : v.func, - theme_url : this.url - }); - }, - - _mceCodeEditor : function(ui, val) { - var ed = this.editor; - - ed.windowManager.open({ - url : this.url + '/source_editor.htm', - width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), - height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), - inline : true, - resizable : true, - maximizable : true - }, { - theme_url : this.url - }); - }, - - _mceImage : function(ui, val) { - var ed = this.editor; - - // Internal image object like a flash placeholder - if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) - return; - - ed.windowManager.open({ - url : this.url + '/image.htm', - width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), - height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceLink : function(ui, val) { - var ed = this.editor; - - ed.windowManager.open({ - url : this.url + '/link.htm', - width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), - height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), - inline : true - }, { - theme_url : this.url - }); - }, - - _mceNewDocument : function() { - var ed = this.editor; - - ed.windowManager.confirm('advanced.newdocument', function(s) { - if (s) - ed.execCommand('mceSetContent', false, ''); - }); - }, - - _mceForeColor : function() { - var t = this; - - this._mceColorPicker(0, { - color: t.fgColor, - func : function(co) { - t.fgColor = co; - t.editor.execCommand('ForeColor', false, co); - } - }); - }, - - _mceBackColor : function() { - var t = this; - - this._mceColorPicker(0, { - color: t.bgColor, - func : function(co) { - t.bgColor = co; - t.editor.execCommand('HiliteColor', false, co); - } - }); - }, - - _ufirst : function(s) { - return s.substring(0, 1).toUpperCase() + s.substring(1); - } - }); - - tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); -}(tinymce)); diff --git a/plugins/TinyMCE/js/themes/advanced/image.htm b/plugins/TinyMCE/js/themes/advanced/image.htm deleted file mode 100644 index b8ba729f6f..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/image.htm +++ /dev/null @@ -1,80 +0,0 @@ - - - - {#advanced_dlg.image_title} - - - - - - -
    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
     
    - x -
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg b/plugins/TinyMCE/js/themes/advanced/img/colorpicker.jpg deleted file mode 100644 index b1a377aba7784d3a0a0fabb4d22b8114cde25ace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2584 zcmb7Bc{JPk7XQT-ib;b~B!n)ZQYwihloXMus-;?bMO70&%O72KlgJueK-#swASle5Y5YhT*O%%dE zAkc>z8ik-xeL_Q`VvZfo0TzI`m>5`0R2&QjOGtcPyzrU;Ul*Hn2<045)l;>V5-MK0^|t(rvM}*3>DEeQ&X2g z3ksC~i~iFKh=?B5i-83o3#TV^B0=RA*fOi#-=2VN?CKn!VTTmGv17_PGbp~tmc*?G?Q3b)|K!w2vr zE#B_JH@ru}sZ}~Z&Y(BdJ;w0B<_kXtGuOzs3$vq}6fO9@x%kiyX*#pRnd1k|;ZC9lr#>sh{3$yY|bYY6^>YT3sgsjiaZ zt)366^&;$S^TAwvN^I2ac+hLh>*VqIos|eL+aL&+l(KvNwWYDctNE^CZRyy^Hk}Gm zs%JVikvO#Mk)X?@TXY=wD38V@;t?)q3)?k2YvxLQMV|Z{nbR2g{a11;p-%!QgLK)B zOxbfUi(pzhsbuCxGBk6FDP#0RPN626_I($Qo;ZGhzWMfs%mMoI+aSZnc5a0+bG2w> zdwgm4&zp*i7B>D%H%G$4FMfG12)D3b{1}-HBqY<6w=n2s8b{B_D%uFYtH{l(Gjv9e zWpFy-6fULzp*cl~BJ4!l*}~J{8#NXk`;x5Nxc+^GEA?|AACg+K)(M|zxHsxFUr9^W z8>QdvdWEw!My?R7!O*p>?3Vb|(=N3|J09OD{Yf#{7*(=rbThiBH~Pm^1tz8SQ?S_2 zsL7(bX9dJ9E%uV^(+dSB)^w=MsF&jg*N2Yjo41m`+WsE&JM@CatfiOlPhC?QPlCp7 zkjesJENk4=dSaN^0M0u1TG4#qeAKgyC$GLGD7II&*kr2|#1!BvS`Grg^OIWk%YAqd zvOcmz%SU-HCVg&rbnPaNZ@-T>)?IP3SO z`YKP&>q@U~m`o*wvU{S1o};9b|8*hRw?;H&TJo4a*7;m_)Q!aD3a1rnAWdVgkH=Lu zObSl!m}$JlWj5VNXvuO#F5@@cmhB(M4yEbSXe%Ptp_SH5SxG-pk!2PJGzE6Dd$(C0 z@d~vVd*NT)SU<2GYn`hA?4|dNDwAu?ZjXWSO9CasoBO}LQ2uFAj@4t0$2xTLEHxw3 z9KJCkFq|08Vmgmxahm%mjA%=I%Gs1mlNy$Km`%^o|A2`!bMPtTrP9y*c^+0M7OCcy z*j^fh4AjCI;2fso0|cz3p5Ih7h72bSVc6YE5O%+w*;qWtI~3hL4IzfscqG;j3j4$- zGt%o#6n#5{gEJw#3{=edteC(w|C#XBp!T8k; z1)EnwGqJ26>c-cDOJv5}Snt!0vhVoS>u03BZj_q+20phaQo81-&IAo;URjUJNTP{F zJ1=+YL^+~uVv(VHc>guRDB*Gug-NN7$n25zaX5RGugKeb5qMo|<1CcSE4+{PPcxQG zv3ZU;p_ZeurmcbMiK+xooGWRsM@gr+Dhpr7I*ST8obbMa5|CLQW{h63?CM{F=X{nL zs0Exdc{AnwAx@;9BObf9QiL5^p(iN?W^L~%mn5*ee?M2!d$&oxYIK&9bd1oX&-$gA z3T&To>*_6TDnv)9{*of(wm?U7D)X3u^_3;FijXcEo0S{8x^h(v0jeTdW0Q} zOC0Y|wO&b<-xFprPec9-SKwJYz4Pbz|~nyPrCb5|2|%P;^(%>|XHw4OO3JkE+QD zWRIhqlT(0Yu4KKuvUjKlnW`S~l&?fXH-Bf`2d!J=4UHXDv4xLDnvd2_EWTb3hReh6sXpEI(hmlM{1 gF4ie0tgS$y#z=nxNn#Fpd0bt##g=j86Aowo21S>Ot^fc4 diff --git a/plugins/TinyMCE/js/themes/advanced/img/flash.gif b/plugins/TinyMCE/js/themes/advanced/img/flash.gif deleted file mode 100644 index dec3f7c7028df98657860529461af29b8793601c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmVM~p;I&fgwbZVtlRJPxC7uw?yFxEX;uVr4IeWCJ^(5m4hjYVM>G^+2V)FnXE$mS p86yHh03AmHCKD}bWutOkFce4&0zF5CG_Myp4hRT+ig>^g06S0cRV@Gj diff --git a/plugins/TinyMCE/js/themes/advanced/img/icons.gif b/plugins/TinyMCE/js/themes/advanced/img/icons.gif deleted file mode 100644 index 641a9e3d314f4ea051692a2274aeb281456f5df9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11790 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 H6d0@lT&58X diff --git a/plugins/TinyMCE/js/themes/advanced/img/pagebreak.gif b/plugins/TinyMCE/js/themes/advanced/img/pagebreak.gif deleted file mode 100644 index acdf4085f3068c4c0a1d6855f4b80dae8bac3068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmV-L0lNN2Nk%w1VPpUd0J9GO`>v<{=;ru;boX6P{`2zsmyZ3>&HK5t_;hIbi-G;z z+4`cI{KdfcXj}GCLjV8&A^8LW000jFEC2ui0Av6R000E?@X1N5y*TU5yZ>M)j$|1M z4Ouvb$pHu>IW8BZq|n;U0s@T!VM5~w1_+1X!EiVl!&PITYdjT!ffYfpt{jAfv%qvh zA63WUHSlr7LkeyaV4(pM0f50(II?RD4RtMg4-E+tFhdAy5{3c=0}3Bg9Y8`B2To20 zR%SO62L%9}0H+dzoKB$+2TOwzUrwi{XiBM^4V#>63q3!LsU3u93zH8CdwqY%62;1g z0g8ze$k93lWExp`CUe|K4qOWk17ZeJ0|5pDP6+}};{>bI@lOWj=kf}r2sHp7w9-Ie XK%9UG6W(*AX-vY05F<*&5CH%?Gwy&_ diff --git a/plugins/TinyMCE/js/themes/advanced/img/quicktime.gif b/plugins/TinyMCE/js/themes/advanced/img/quicktime.gif deleted file mode 100644 index 8f10e7aa6b6ab40ee69a1a41a961c092168d6fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+|QNk%w1VGsZi0Q4UK+~)L6v+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8!}sO$`q%8%`=C5EEn#1d#z95FHtK5(^#(cp^e+Y!d=4FCrFbY9A3U z4-O0-4kHJPJ2(jk13n5879s!!3Q`V>8VwW`9my3H#|R8ZD+fdx0E-+693cQZ;!k;* diff --git a/plugins/TinyMCE/js/themes/advanced/img/realmedia.gif b/plugins/TinyMCE/js/themes/advanced/img/realmedia.gif deleted file mode 100644 index fdfe0b9ac05869ae845fdd828eaad97cc0c69dbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9HwNk%w1VI=?(0K^{vQcz8xz}f&njBB06v9GQ`Jv%NdDHCI&z`wqZw$(Lw zuFTBL!Pe#<92tv>h)9OE1Xh}vnVEHSaeb-GByg#tqM_B*)YRkdSdqTu&}n`s(k;lb>H+`#+Q6|3c{>OLTv23;utm>DSfy zuOD3adm!iUuGar)4FAhzel5=UwZ7*6(K(+k@BP_g{o}}@k7u_2k7W2iGwlom!+#Z( z|Hj5w_4MwTo8QaHxm#EFYX1DUOO|}vvgQBb!_ST${rmj+`+Fep|C$j4HGtwz7FGrZ zO$Hs1VIV&_u+2R%#bJV$RKJIcL*N7vss0Y-EsB{gGlSJaTr>sRLKbLj5HMTpyK;)l zJcfpaMYltBZdEK6Kht6+BPy*VtthFMtIoqFC=#Tu$e^eaDXCC7U0vOYOJjNk(;P!VagC#fQ*?7otVO)-#9rK#nB%ry4`E_DHQ Wm01j~^6E13^D1O7+^=wCum%9s<%z=p diff --git a/plugins/TinyMCE/js/themes/advanced/img/trans.gif b/plugins/TinyMCE/js/themes/advanced/img/trans.gif deleted file mode 100644 index 388486517fa8da13ebd150e8f65d5096c3e10c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x diff --git a/plugins/TinyMCE/js/themes/advanced/img/video.gif b/plugins/TinyMCE/js/themes/advanced/img/video.gif deleted file mode 100644 index 3570104077a3b3585f11403c8d4c3fc9351f35d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmZ?wbhEHb6krfwc$UTx9v<%P?Ok48Ze?YanwpxCkzrwBk(ZYzB_&l;Qw!gmM(Ep^QBwbzIoSdAh>*2n> zz9l6k0Xw#(?);y5^ls9w|LObxXI*si^YfcEYu3*P8J(S-PEJlaNB-yTd}C^Ax@_69 zzP`Ryt5)S5`=P3;TDk9SbaeFk_3NiTjGA~aFd-pf@}tlxQ>GLb7jM|Gp`oFHlaq7F zk|nvhxjsHV=g+oST3Rl6T(N1>rn0iK*Ed>3MMVn>3vF#}**q!otE>Sy|^jDoRUBoBANRc=wyaJged$+}u3x zK}ld>puWET{||NozXdO-0f3nK$V8iNkVNKl+Guy1NeYie$3 zZB}=&Zex!RYq8YfVwgNdMpdFkN|rU!Fha}0m66q>CDxczOhH^pM9qvxw1p`;Rftzu zQJ&9}g>iErlc2ORw;aC_=l*6UJ=st%r*ISVV2jgDT<)w>rXHGL<21Kdo z#uyug^O^t z0hZGrt*x!>$1C!zn`W5@`ts6_uMW)2%<0NUEKIo?SIPPE=}U0}7Z(?JcX!y=*;bF< zCWz-=h7+2ao9)(dOHM;+X=xs9)%!~xc&ICMZdRYdUQ2$^@9y(6X3NCIz{cM7f^Z=Q z1_tQ95kgl8b%R%OiYTIo7LSdE^@}A^8LW002J#EC2ui01p5U000KOz@O0K01zUifeIyT9%!RzMDgehG|mwLz+Eh; z7Z~iE zrX?OfJ^>XeDJK)xJuWOB3_l1N0Ra>g4Gk^=ED0V6LI?>4;Q|6OB{LplLMRLg8U5-E J?0y6R06W6!pgRBn diff --git a/plugins/TinyMCE/js/themes/advanced/js/about.js b/plugins/TinyMCE/js/themes/advanced/js/about.js deleted file mode 100644 index 5b35845761..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/about.js +++ /dev/null @@ -1,73 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -function init() { - var ed, tcont; - - tinyMCEPopup.resizeToInnerSize(); - ed = tinyMCEPopup.editor; - - // Give FF some time - window.setTimeout(insertHelpIFrame, 10); - - tcont = document.getElementById('plugintablecontainer'); - document.getElementById('plugins_tab').style.display = 'none'; - - var html = ""; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - - tinymce.each(ed.plugins, function(p, n) { - var info; - - if (!p.getInfo) - return; - - html += ''; - - info = p.getInfo(); - - if (info.infourl != null && info.infourl != '') - html += ''; - else - html += ''; - - if (info.authorurl != null && info.authorurl != '') - html += ''; - else - html += ''; - - html += ''; - html += ''; - - document.getElementById('plugins_tab').style.display = ''; - - }); - - html += ''; - html += '
    ' + ed.getLang('advanced_dlg.about_plugin') + '' + ed.getLang('advanced_dlg.about_author') + '' + ed.getLang('advanced_dlg.about_version') + '
    ' + info.longname + '' + info.longname + '' + info.author + '' + info.author + '' + info.version + '
    '; - - tcont.innerHTML = html; - - tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; - tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; -} - -function insertHelpIFrame() { - var html; - - if (tinyMCEPopup.getParam('docs_url')) { - html = ''; - document.getElementById('iframecontainer').innerHTML = html; - document.getElementById('help_tab').style.display = 'block'; - document.getElementById('help_tab').setAttribute("aria-hidden", "false"); - } -} - -tinyMCEPopup.onInit.add(init); diff --git a/plugins/TinyMCE/js/themes/advanced/js/anchor.js b/plugins/TinyMCE/js/themes/advanced/js/anchor.js deleted file mode 100644 index e528e4f42f..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/anchor.js +++ /dev/null @@ -1,42 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var AnchorDialog = { - init : function(ed) { - var action, elm, f = document.forms[0]; - - this.editor = ed; - elm = ed.dom.getParent(ed.selection.getNode(), 'A'); - v = ed.dom.getAttrib(elm, 'name'); - - if (v) { - this.action = 'update'; - f.anchorName.value = v; - } - - f.insert.value = ed.getLang(elm ? 'update' : 'insert'); - }, - - update : function() { - var ed = this.editor, elm, name = document.forms[0].anchorName.value; - - if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { - tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); - return; - } - - tinyMCEPopup.restoreSelection(); - - if (this.action != 'update') - ed.selection.collapse(1); - - elm = ed.dom.getParent(ed.selection.getNode(), 'A'); - if (elm) - elm.name = name; - else - ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); - - tinyMCEPopup.close(); - } -}; - -tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/charmap.js b/plugins/TinyMCE/js/themes/advanced/js/charmap.js deleted file mode 100644 index 1cead6dfe8..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/charmap.js +++ /dev/null @@ -1,355 +0,0 @@ -/** - * charmap.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -tinyMCEPopup.requireLangPack(); - -var charmap = [ - [' ', ' ', true, 'no-break space'], - ['&', '&', true, 'ampersand'], - ['"', '"', true, 'quotation mark'], -// finance - ['¢', '¢', true, 'cent sign'], - ['€', '€', true, 'euro sign'], - ['£', '£', true, 'pound sign'], - ['¥', '¥', true, 'yen sign'], -// signs - ['©', '©', true, 'copyright sign'], - ['®', '®', true, 'registered sign'], - ['™', '™', true, 'trade mark sign'], - ['‰', '‰', true, 'per mille sign'], - ['µ', 'µ', true, 'micro sign'], - ['·', '·', true, 'middle dot'], - ['•', '•', true, 'bullet'], - ['…', '…', true, 'three dot leader'], - ['′', '′', true, 'minutes / feet'], - ['″', '″', true, 'seconds / inches'], - ['§', '§', true, 'section sign'], - ['¶', '¶', true, 'paragraph sign'], - ['ß', 'ß', true, 'sharp s / ess-zed'], -// quotations - ['‹', '‹', true, 'single left-pointing angle quotation mark'], - ['›', '›', true, 'single right-pointing angle quotation mark'], - ['«', '«', true, 'left pointing guillemet'], - ['»', '»', true, 'right pointing guillemet'], - ['‘', '‘', true, 'left single quotation mark'], - ['’', '’', true, 'right single quotation mark'], - ['“', '“', true, 'left double quotation mark'], - ['”', '”', true, 'right double quotation mark'], - ['‚', '‚', true, 'single low-9 quotation mark'], - ['„', '„', true, 'double low-9 quotation mark'], - ['<', '<', true, 'less-than sign'], - ['>', '>', true, 'greater-than sign'], - ['≤', '≤', true, 'less-than or equal to'], - ['≥', '≥', true, 'greater-than or equal to'], - ['–', '–', true, 'en dash'], - ['—', '—', true, 'em dash'], - ['¯', '¯', true, 'macron'], - ['‾', '‾', true, 'overline'], - ['¤', '¤', true, 'currency sign'], - ['¦', '¦', true, 'broken bar'], - ['¨', '¨', true, 'diaeresis'], - ['¡', '¡', true, 'inverted exclamation mark'], - ['¿', '¿', true, 'turned question mark'], - ['ˆ', 'ˆ', true, 'circumflex accent'], - ['˜', '˜', true, 'small tilde'], - ['°', '°', true, 'degree sign'], - ['−', '−', true, 'minus sign'], - ['±', '±', true, 'plus-minus sign'], - ['÷', '÷', true, 'division sign'], - ['⁄', '⁄', true, 'fraction slash'], - ['×', '×', true, 'multiplication sign'], - ['¹', '¹', true, 'superscript one'], - ['²', '²', true, 'superscript two'], - ['³', '³', true, 'superscript three'], - ['¼', '¼', true, 'fraction one quarter'], - ['½', '½', true, 'fraction one half'], - ['¾', '¾', true, 'fraction three quarters'], -// math / logical - ['ƒ', 'ƒ', true, 'function / florin'], - ['∫', '∫', true, 'integral'], - ['∑', '∑', true, 'n-ary sumation'], - ['∞', '∞', true, 'infinity'], - ['√', '√', true, 'square root'], - ['∼', '∼', false,'similar to'], - ['≅', '≅', false,'approximately equal to'], - ['≈', '≈', true, 'almost equal to'], - ['≠', '≠', true, 'not equal to'], - ['≡', '≡', true, 'identical to'], - ['∈', '∈', false,'element of'], - ['∉', '∉', false,'not an element of'], - ['∋', '∋', false,'contains as member'], - ['∏', '∏', true, 'n-ary product'], - ['∧', '∧', false,'logical and'], - ['∨', '∨', false,'logical or'], - ['¬', '¬', true, 'not sign'], - ['∩', '∩', true, 'intersection'], - ['∪', '∪', false,'union'], - ['∂', '∂', true, 'partial differential'], - ['∀', '∀', false,'for all'], - ['∃', '∃', false,'there exists'], - ['∅', '∅', false,'diameter'], - ['∇', '∇', false,'backward difference'], - ['∗', '∗', false,'asterisk operator'], - ['∝', '∝', false,'proportional to'], - ['∠', '∠', false,'angle'], -// undefined - ['´', '´', true, 'acute accent'], - ['¸', '¸', true, 'cedilla'], - ['ª', 'ª', true, 'feminine ordinal indicator'], - ['º', 'º', true, 'masculine ordinal indicator'], - ['†', '†', true, 'dagger'], - ['‡', '‡', true, 'double dagger'], -// alphabetical special chars - ['À', 'À', true, 'A - grave'], - ['Á', 'Á', true, 'A - acute'], - ['Â', 'Â', true, 'A - circumflex'], - ['Ã', 'Ã', true, 'A - tilde'], - ['Ä', 'Ä', true, 'A - diaeresis'], - ['Å', 'Å', true, 'A - ring above'], - ['Æ', 'Æ', true, 'ligature AE'], - ['Ç', 'Ç', true, 'C - cedilla'], - ['È', 'È', true, 'E - grave'], - ['É', 'É', true, 'E - acute'], - ['Ê', 'Ê', true, 'E - circumflex'], - ['Ë', 'Ë', true, 'E - diaeresis'], - ['Ì', 'Ì', true, 'I - grave'], - ['Í', 'Í', true, 'I - acute'], - ['Î', 'Î', true, 'I - circumflex'], - ['Ï', 'Ï', true, 'I - diaeresis'], - ['Ð', 'Ð', true, 'ETH'], - ['Ñ', 'Ñ', true, 'N - tilde'], - ['Ò', 'Ò', true, 'O - grave'], - ['Ó', 'Ó', true, 'O - acute'], - ['Ô', 'Ô', true, 'O - circumflex'], - ['Õ', 'Õ', true, 'O - tilde'], - ['Ö', 'Ö', true, 'O - diaeresis'], - ['Ø', 'Ø', true, 'O - slash'], - ['Œ', 'Œ', true, 'ligature OE'], - ['Š', 'Š', true, 'S - caron'], - ['Ù', 'Ù', true, 'U - grave'], - ['Ú', 'Ú', true, 'U - acute'], - ['Û', 'Û', true, 'U - circumflex'], - ['Ü', 'Ü', true, 'U - diaeresis'], - ['Ý', 'Ý', true, 'Y - acute'], - ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], - ['Þ', 'Þ', true, 'THORN'], - ['à', 'à', true, 'a - grave'], - ['á', 'á', true, 'a - acute'], - ['â', 'â', true, 'a - circumflex'], - ['ã', 'ã', true, 'a - tilde'], - ['ä', 'ä', true, 'a - diaeresis'], - ['å', 'å', true, 'a - ring above'], - ['æ', 'æ', true, 'ligature ae'], - ['ç', 'ç', true, 'c - cedilla'], - ['è', 'è', true, 'e - grave'], - ['é', 'é', true, 'e - acute'], - ['ê', 'ê', true, 'e - circumflex'], - ['ë', 'ë', true, 'e - diaeresis'], - ['ì', 'ì', true, 'i - grave'], - ['í', 'í', true, 'i - acute'], - ['î', 'î', true, 'i - circumflex'], - ['ï', 'ï', true, 'i - diaeresis'], - ['ð', 'ð', true, 'eth'], - ['ñ', 'ñ', true, 'n - tilde'], - ['ò', 'ò', true, 'o - grave'], - ['ó', 'ó', true, 'o - acute'], - ['ô', 'ô', true, 'o - circumflex'], - ['õ', 'õ', true, 'o - tilde'], - ['ö', 'ö', true, 'o - diaeresis'], - ['ø', 'ø', true, 'o slash'], - ['œ', 'œ', true, 'ligature oe'], - ['š', 'š', true, 's - caron'], - ['ù', 'ù', true, 'u - grave'], - ['ú', 'ú', true, 'u - acute'], - ['û', 'û', true, 'u - circumflex'], - ['ü', 'ü', true, 'u - diaeresis'], - ['ý', 'ý', true, 'y - acute'], - ['þ', 'þ', true, 'thorn'], - ['ÿ', 'ÿ', true, 'y - diaeresis'], - ['Α', 'Α', true, 'Alpha'], - ['Β', 'Β', true, 'Beta'], - ['Γ', 'Γ', true, 'Gamma'], - ['Δ', 'Δ', true, 'Delta'], - ['Ε', 'Ε', true, 'Epsilon'], - ['Ζ', 'Ζ', true, 'Zeta'], - ['Η', 'Η', true, 'Eta'], - ['Θ', 'Θ', true, 'Theta'], - ['Ι', 'Ι', true, 'Iota'], - ['Κ', 'Κ', true, 'Kappa'], - ['Λ', 'Λ', true, 'Lambda'], - ['Μ', 'Μ', true, 'Mu'], - ['Ν', 'Ν', true, 'Nu'], - ['Ξ', 'Ξ', true, 'Xi'], - ['Ο', 'Ο', true, 'Omicron'], - ['Π', 'Π', true, 'Pi'], - ['Ρ', 'Ρ', true, 'Rho'], - ['Σ', 'Σ', true, 'Sigma'], - ['Τ', 'Τ', true, 'Tau'], - ['Υ', 'Υ', true, 'Upsilon'], - ['Φ', 'Φ', true, 'Phi'], - ['Χ', 'Χ', true, 'Chi'], - ['Ψ', 'Ψ', true, 'Psi'], - ['Ω', 'Ω', true, 'Omega'], - ['α', 'α', true, 'alpha'], - ['β', 'β', true, 'beta'], - ['γ', 'γ', true, 'gamma'], - ['δ', 'δ', true, 'delta'], - ['ε', 'ε', true, 'epsilon'], - ['ζ', 'ζ', true, 'zeta'], - ['η', 'η', true, 'eta'], - ['θ', 'θ', true, 'theta'], - ['ι', 'ι', true, 'iota'], - ['κ', 'κ', true, 'kappa'], - ['λ', 'λ', true, 'lambda'], - ['μ', 'μ', true, 'mu'], - ['ν', 'ν', true, 'nu'], - ['ξ', 'ξ', true, 'xi'], - ['ο', 'ο', true, 'omicron'], - ['π', 'π', true, 'pi'], - ['ρ', 'ρ', true, 'rho'], - ['ς', 'ς', true, 'final sigma'], - ['σ', 'σ', true, 'sigma'], - ['τ', 'τ', true, 'tau'], - ['υ', 'υ', true, 'upsilon'], - ['φ', 'φ', true, 'phi'], - ['χ', 'χ', true, 'chi'], - ['ψ', 'ψ', true, 'psi'], - ['ω', 'ω', true, 'omega'], -// symbols - ['ℵ', 'ℵ', false,'alef symbol'], - ['ϖ', 'ϖ', false,'pi symbol'], - ['ℜ', 'ℜ', false,'real part symbol'], - ['ϑ','ϑ', false,'theta symbol'], - ['ϒ', 'ϒ', false,'upsilon - hook symbol'], - ['℘', '℘', false,'Weierstrass p'], - ['ℑ', 'ℑ', false,'imaginary part'], -// arrows - ['←', '←', true, 'leftwards arrow'], - ['↑', '↑', true, 'upwards arrow'], - ['→', '→', true, 'rightwards arrow'], - ['↓', '↓', true, 'downwards arrow'], - ['↔', '↔', true, 'left right arrow'], - ['↵', '↵', false,'carriage return'], - ['⇐', '⇐', false,'leftwards double arrow'], - ['⇑', '⇑', false,'upwards double arrow'], - ['⇒', '⇒', false,'rightwards double arrow'], - ['⇓', '⇓', false,'downwards double arrow'], - ['⇔', '⇔', false,'left right double arrow'], - ['∴', '∴', false,'therefore'], - ['⊂', '⊂', false,'subset of'], - ['⊃', '⊃', false,'superset of'], - ['⊄', '⊄', false,'not a subset of'], - ['⊆', '⊆', false,'subset of or equal to'], - ['⊇', '⊇', false,'superset of or equal to'], - ['⊕', '⊕', false,'circled plus'], - ['⊗', '⊗', false,'circled times'], - ['⊥', '⊥', false,'perpendicular'], - ['⋅', '⋅', false,'dot operator'], - ['⌈', '⌈', false,'left ceiling'], - ['⌉', '⌉', false,'right ceiling'], - ['⌊', '⌊', false,'left floor'], - ['⌋', '⌋', false,'right floor'], - ['⟨', '〈', false,'left-pointing angle bracket'], - ['⟩', '〉', false,'right-pointing angle bracket'], - ['◊', '◊', true, 'lozenge'], - ['♠', '♠', true, 'black spade suit'], - ['♣', '♣', true, 'black club suit'], - ['♥', '♥', true, 'black heart suit'], - ['♦', '♦', true, 'black diamond suit'], - [' ', ' ', false,'en space'], - [' ', ' ', false,'em space'], - [' ', ' ', false,'thin space'], - ['‌', '‌', false,'zero width non-joiner'], - ['‍', '‍', false,'zero width joiner'], - ['‎', '‎', false,'left-to-right mark'], - ['‏', '‏', false,'right-to-left mark'], - ['­', '­', false,'soft hyphen'] -]; - -tinyMCEPopup.onInit.add(function() { - tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); - addKeyboardNavigation(); -}); - -function addKeyboardNavigation(){ - var tableElm, cells, settings; - - cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup"); - - settings ={ - root: "charmapgroup", - items: cells - }; - - tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); -} - -function renderCharMapHTML() { - var charsPerRow = 20, tdWidth=20, tdHeight=20, i; - var html = '
    '+ - ''; - var cols=-1; - - for (i=0; i' - + '' - + charmap[i][1] - + ''; - if ((cols+1) % charsPerRow == 0) - html += ''; - } - } - - if (cols % charsPerRow > 0) { - var padd = charsPerRow - (cols % charsPerRow); - for (var i=0; i '; - } - - html += '
    '; - html = html.replace(/<\/tr>/g, ''); - - return html; -} - -function insertChar(chr) { - tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); - - // Refocus in window - if (tinyMCEPopup.isWindow) - window.focus(); - - tinyMCEPopup.editor.focus(); - tinyMCEPopup.close(); -} - -function previewChar(codeA, codeB, codeN) { - var elmA = document.getElementById('codeA'); - var elmB = document.getElementById('codeB'); - var elmV = document.getElementById('codeV'); - var elmN = document.getElementById('codeN'); - - if (codeA=='#160;') { - elmV.innerHTML = '__'; - } else { - elmV.innerHTML = '&' + codeA; - } - - elmB.innerHTML = '&' + codeA; - elmA.innerHTML = '&' + codeB; - elmN.innerHTML = codeN; -} diff --git a/plugins/TinyMCE/js/themes/advanced/js/color_picker.js b/plugins/TinyMCE/js/themes/advanced/js/color_picker.js deleted file mode 100644 index 7decac5b43..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/color_picker.js +++ /dev/null @@ -1,329 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false; - -var colors = [ - "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", - "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", - "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", - "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", - "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", - "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", - "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", - "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", - "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", - "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", - "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", - "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", - "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", - "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", - "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", - "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", - "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", - "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", - "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", - "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", - "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", - "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", - "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", - "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", - "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", - "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", - "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" -]; - -var named = { - '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', - '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', - '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', - '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', - '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', - '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', - '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', - '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', - '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', - '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', - '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', - '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', - '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', - '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', - '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', - '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', - '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', - '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', - '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', - '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', - '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', - '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', - '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' -}; - -var namedLookup = {}; - -function init() { - var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; - - tinyMCEPopup.resizeToInnerSize(); - - generatePicker(); - generateWebColors(); - generateNamedColors(); - - if (inputColor) { - changeFinalColor(inputColor); - - col = convertHexToRGB(inputColor); - - if (col) - updateLight(col.r, col.g, col.b); - } - - for (key in named) { - value = named[key]; - namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); - } -} - -function toHexColor(color) { - var matches, red, green, blue, toInt = parseInt; - - function hex(value) { - value = parseInt(value).toString(16); - - return value.length > 1 ? value : '0' + value; // Padd with leading zero - }; - - color = color.replace(/[\s#]+/g, '').toLowerCase(); - color = namedLookup[color] || color; - matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color); - - if (matches) { - if (matches[1]) { - red = toInt(matches[1]); - green = toInt(matches[2]); - blue = toInt(matches[3]); - } else if (matches[4]) { - red = toInt(matches[4], 16); - green = toInt(matches[5], 16); - blue = toInt(matches[6], 16); - } else if (matches[7]) { - red = toInt(matches[7] + matches[7], 16); - green = toInt(matches[8] + matches[8], 16); - blue = toInt(matches[9] + matches[9], 16); - } - - return '#' + hex(red) + hex(green) + hex(blue); - } - - return ''; -} - -function insertAction() { - var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); - - tinyMCEPopup.restoreSelection(); - - if (f) - f(toHexColor(color)); - - tinyMCEPopup.close(); -} - -function showColor(color, name) { - if (name) - document.getElementById("colorname").innerHTML = name; - - document.getElementById("preview").style.backgroundColor = color; - document.getElementById("color").value = color.toUpperCase(); -} - -function convertRGBToHex(col) { - var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); - - if (!col) - return col; - - var rgb = col.replace(re, "$1,$2,$3").split(','); - if (rgb.length == 3) { - r = parseInt(rgb[0]).toString(16); - g = parseInt(rgb[1]).toString(16); - b = parseInt(rgb[2]).toString(16); - - r = r.length == 1 ? '0' + r : r; - g = g.length == 1 ? '0' + g : g; - b = b.length == 1 ? '0' + b : b; - - return "#" + r + g + b; - } - - return col; -} - -function convertHexToRGB(col) { - if (col.indexOf('#') != -1) { - col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); - - r = parseInt(col.substring(0, 2), 16); - g = parseInt(col.substring(2, 4), 16); - b = parseInt(col.substring(4, 6), 16); - - return {r : r, g : g, b : b}; - } - - return null; -} - -function generatePicker() { - var el = document.getElementById('light'), h = '', i; - - for (i = 0; i < detail; i++){ - h += '
    '; - } - - el.innerHTML = h; -} - -function generateWebColors() { - var el = document.getElementById('webcolors'), h = '', i; - - if (el.className == 'generated') - return; - - // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. - h += '
    ' - + ''; - - for (i=0; i' - + ''; - if (tinyMCEPopup.editor.forcedHighContrastMode) { - h += ''; - } - h += ''; - h += ''; - if ((i+1) % 18 == 0) - h += ''; - } - - h += '
    '; - - el.innerHTML = h; - el.className = 'generated'; - - paintCanvas(el); - enableKeyboardNavigation(el.firstChild); -} - -function paintCanvas(el) { - tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { - var context; - if (canvas.getContext && (context = canvas.getContext("2d"))) { - context.fillStyle = canvas.getAttribute('data-color'); - context.fillRect(0, 0, 10, 10); - } - }); -} -function generateNamedColors() { - var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; - - if (el.className == 'generated') - return; - - for (n in named) { - v = named[n]; - h += ''; - if (tinyMCEPopup.editor.forcedHighContrastMode) { - h += ''; - } - h += ''; - h += ''; - i++; - } - - el.innerHTML = h; - el.className = 'generated'; - - paintCanvas(el); - enableKeyboardNavigation(el); -} - -function enableKeyboardNavigation(el) { - tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { - root: el, - items: tinyMCEPopup.dom.select('a', el) - }, tinyMCEPopup.dom); -} - -function dechex(n) { - return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); -} - -function computeColor(e) { - var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; - - x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); - y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); - - partWidth = document.getElementById('colors').width / 6; - partDetail = detail / 2; - imHeight = document.getElementById('colors').height; - - r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; - g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); - b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); - - coef = (imHeight - y) / imHeight; - r = 128 + (r - 128) * coef; - g = 128 + (g - 128) * coef; - b = 128 + (b - 128) * coef; - - changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); - updateLight(r, g, b); -} - -function updateLight(r, g, b) { - var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; - - for (i=0; i=0) && (i'); - }, - - init : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor; - - // Setup browse button - document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); - if (isVisible('srcbrowser')) - document.getElementById('src').style.width = '180px'; - - e = ed.selection.getNode(); - - this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList')); - - if (e.nodeName == 'IMG') { - f.src.value = ed.dom.getAttrib(e, 'src'); - f.alt.value = ed.dom.getAttrib(e, 'alt'); - f.border.value = this.getAttrib(e, 'border'); - f.vspace.value = this.getAttrib(e, 'vspace'); - f.hspace.value = this.getAttrib(e, 'hspace'); - f.width.value = ed.dom.getAttrib(e, 'width'); - f.height.value = ed.dom.getAttrib(e, 'height'); - f.insert.value = ed.getLang('update'); - this.styleVal = ed.dom.getAttrib(e, 'style'); - selectByValue(f, 'image_list', f.src.value); - selectByValue(f, 'align', this.getAttrib(e, 'align')); - this.updateStyle(); - } - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = typeof(l) === 'function' ? l() : window[l]; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - update : function() { - var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; - - tinyMCEPopup.restoreSelection(); - - if (f.src.value === '') { - if (ed.selection.getNode().nodeName == 'IMG') { - ed.dom.remove(ed.selection.getNode()); - ed.execCommand('mceRepaint'); - } - - tinyMCEPopup.close(); - return; - } - - if (!ed.settings.inline_styles) { - args = tinymce.extend(args, { - vspace : nl.vspace.value, - hspace : nl.hspace.value, - border : nl.border.value, - align : getSelectValue(f, 'align') - }); - } else - args.style = this.styleVal; - - tinymce.extend(args, { - src : f.src.value.replace(/ /g, '%20'), - alt : f.alt.value, - width : f.width.value, - height : f.height.value - }); - - el = ed.selection.getNode(); - - if (el && el.nodeName == 'IMG') { - ed.dom.setAttribs(el, args); - tinyMCEPopup.editor.execCommand('mceRepaint'); - tinyMCEPopup.editor.focus(); - } else { - ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); - ed.dom.setAttribs('__mce_tmp', args); - ed.dom.setAttrib('__mce_tmp', 'id', ''); - ed.undoManager.add(); - } - - tinyMCEPopup.close(); - }, - - updateStyle : function() { - var dom = tinyMCEPopup.dom, st, v, f = document.forms[0]; - - if (tinyMCEPopup.editor.settings.inline_styles) { - st = tinyMCEPopup.dom.parseStyle(this.styleVal); - - // Handle align - v = getSelectValue(f, 'align'); - if (v) { - if (v == 'left' || v == 'right') { - st['float'] = v; - delete st['vertical-align']; - } else { - st['vertical-align'] = v; - delete st['float']; - } - } else { - delete st['float']; - delete st['vertical-align']; - } - - // Handle border - v = f.border.value; - if (v || v == '0') { - if (v == '0') - st['border'] = '0'; - else - st['border'] = v + 'px solid black'; - } else - delete st['border']; - - // Handle hspace - v = f.hspace.value; - if (v) { - delete st['margin']; - st['margin-left'] = v + 'px'; - st['margin-right'] = v + 'px'; - } else { - delete st['margin-left']; - delete st['margin-right']; - } - - // Handle vspace - v = f.vspace.value; - if (v) { - delete st['margin']; - st['margin-top'] = v + 'px'; - st['margin-bottom'] = v + 'px'; - } else { - delete st['margin-top']; - delete st['margin-bottom']; - } - - // Merge - st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); - this.styleVal = dom.serializeStyle(st, 'img'); - } - }, - - getAttrib : function(e, at) { - var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; - - if (ed.settings.inline_styles) { - switch (at) { - case 'align': - if (v = dom.getStyle(e, 'float')) - return v; - - if (v = dom.getStyle(e, 'vertical-align')) - return v; - - break; - - case 'hspace': - v = dom.getStyle(e, 'margin-left') - v2 = dom.getStyle(e, 'margin-right'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'vspace': - v = dom.getStyle(e, 'margin-top') - v2 = dom.getStyle(e, 'margin-bottom'); - if (v && v == v2) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - - case 'border': - v = 0; - - tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { - sv = dom.getStyle(e, 'border-' + sv + '-width'); - - // False or not the same as prev - if (!sv || (sv != v && v !== 0)) { - v = 0; - return false; - } - - if (sv) - v = sv; - }); - - if (v) - return parseInt(v.replace(/[^0-9]/g, '')); - - break; - } - } - - if (v = dom.getAttrib(e, at)) - return v; - - return ''; - }, - - resetImageData : function() { - var f = document.forms[0]; - - f.width.value = f.height.value = ""; - }, - - updateImageData : function() { - var f = document.forms[0], t = ImageDialog; - - if (f.width.value == "") - f.width.value = t.preloadImg.width; - - if (f.height.value == "") - f.height.value = t.preloadImg.height; - }, - - getImageData : function() { - var f = document.forms[0]; - - this.preloadImg = new Image(); - this.preloadImg.onload = this.updateImageData; - this.preloadImg.onerror = this.resetImageData; - this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); - } -}; - -ImageDialog.preInit(); -tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/link.js b/plugins/TinyMCE/js/themes/advanced/js/link.js deleted file mode 100644 index 53ff409e79..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/link.js +++ /dev/null @@ -1,153 +0,0 @@ -tinyMCEPopup.requireLangPack(); - -var LinkDialog = { - preInit : function() { - var url; - - if (url = tinyMCEPopup.getParam("external_link_list_url")) - document.write(''); - }, - - init : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor; - - // Setup browse button - document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); - if (isVisible('hrefbrowser')) - document.getElementById('href').style.width = '180px'; - - this.fillClassList('class_list'); - this.fillFileList('link_list', 'tinyMCELinkList'); - this.fillTargetList('target_list'); - - if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { - f.href.value = ed.dom.getAttrib(e, 'href'); - f.linktitle.value = ed.dom.getAttrib(e, 'title'); - f.insert.value = ed.getLang('update'); - selectByValue(f, 'link_list', f.href.value); - selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); - selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); - } - }, - - update : function() { - var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); - - tinyMCEPopup.restoreSelection(); - e = ed.dom.getParent(ed.selection.getNode(), 'A'); - - // Remove element if there is no href - if (!f.href.value) { - if (e) { - b = ed.selection.getBookmark(); - ed.dom.remove(e, 1); - ed.selection.moveToBookmark(b); - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - return; - } - } - - // Create new anchor elements - if (e == null) { - ed.getDoc().execCommand("unlink", false, null); - tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); - - tinymce.each(ed.dom.select("a"), function(n) { - if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { - e = n; - - ed.dom.setAttribs(e, { - href : href, - title : f.linktitle.value, - target : f.target_list ? getSelectValue(f, "target_list") : null, - 'class' : f.class_list ? getSelectValue(f, "class_list") : null - }); - } - }); - } else { - ed.dom.setAttribs(e, { - href : href, - title : f.linktitle.value, - target : f.target_list ? getSelectValue(f, "target_list") : null, - 'class' : f.class_list ? getSelectValue(f, "class_list") : null - }); - } - - // Don't move caret if selection was image - if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { - ed.focus(); - ed.selection.select(e); - ed.selection.collapse(0); - tinyMCEPopup.storeSelection(); - } - - tinyMCEPopup.execCommand("mceEndUndoLevel"); - tinyMCEPopup.close(); - }, - - checkPrefix : function(n) { - if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) - n.value = 'mailto:' + n.value; - - if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) - n.value = 'http://' + n.value; - }, - - fillFileList : function(id, l) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - l = window[l]; - - if (l && l.length > 0) { - lst.options[lst.options.length] = new Option('', ''); - - tinymce.each(l, function(o) { - lst.options[lst.options.length] = new Option(o[0], o[1]); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillClassList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; - - if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { - cl = []; - - tinymce.each(v.split(';'), function(v) { - var p = v.split('='); - - cl.push({'title' : p[0], 'class' : p[1]}); - }); - } else - cl = tinyMCEPopup.editor.dom.getClasses(); - - if (cl.length > 0) { - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - - tinymce.each(cl, function(o) { - lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); - }); - } else - dom.remove(dom.getParent(id, 'tr')); - }, - - fillTargetList : function(id) { - var dom = tinyMCEPopup.dom, lst = dom.get(id), v; - - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); - lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); - - if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { - tinymce.each(v.split(','), function(v) { - v = v.split('='); - lst.options[lst.options.length] = new Option(v[0], v[1]); - }); - } - } -}; - -LinkDialog.preInit(); -tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/plugins/TinyMCE/js/themes/advanced/js/source_editor.js b/plugins/TinyMCE/js/themes/advanced/js/source_editor.js deleted file mode 100644 index 84546ad52e..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/js/source_editor.js +++ /dev/null @@ -1,56 +0,0 @@ -tinyMCEPopup.requireLangPack(); -tinyMCEPopup.onInit.add(onLoadInit); - -function saveContent() { - tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); - tinyMCEPopup.close(); -} - -function onLoadInit() { - tinyMCEPopup.resizeToInnerSize(); - - // Remove Gecko spellchecking - if (tinymce.isGecko) - document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); - - document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); - - if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { - setWrap('soft'); - document.getElementById('wraped').checked = true; - } - - resizeInputs(); -} - -function setWrap(val) { - var v, n, s = document.getElementById('htmlSource'); - - s.wrap = val; - - if (!tinymce.isIE) { - v = s.value; - n = s.cloneNode(false); - n.setAttribute("wrap", val); - s.parentNode.replaceChild(n, s); - n.value = v; - } -} - -function toggleWordWrap(elm) { - if (elm.checked) - setWrap('soft'); - else - setWrap('off'); -} - -function resizeInputs() { - var vp = tinyMCEPopup.dom.getViewPort(window), el; - - el = document.getElementById('htmlSource'); - - if (el) { - el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 65) + 'px'; - } -} diff --git a/plugins/TinyMCE/js/themes/advanced/langs/en.js b/plugins/TinyMCE/js/themes/advanced/langs/en.js deleted file mode 100644 index fbf29893fe..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/langs/en.js +++ /dev/null @@ -1,68 +0,0 @@ -tinyMCE.addI18n('en.advanced',{ -style_select:"Styles", -font_size:"Font size", -fontdefault:"Font family", -block:"Format", -paragraph:"Paragraph", -div:"Div", -address:"Address", -pre:"Preformatted", -h1:"Heading 1", -h2:"Heading 2", -h3:"Heading 3", -h4:"Heading 4", -h5:"Heading 5", -h6:"Heading 6", -blockquote:"Blockquote", -code:"Code", -samp:"Code sample", -dt:"Definition term ", -dd:"Definition description", -bold_desc:"Bold (Ctrl+B)", -italic_desc:"Italic (Ctrl+I)", -underline_desc:"Underline (Ctrl+U)", -striketrough_desc:"Strikethrough", -justifyleft_desc:"Align left", -justifycenter_desc:"Align center", -justifyright_desc:"Align right", -justifyfull_desc:"Align full", -bullist_desc:"Unordered list", -numlist_desc:"Ordered list", -outdent_desc:"Outdent", -indent_desc:"Indent", -undo_desc:"Undo (Ctrl+Z)", -redo_desc:"Redo (Ctrl+Y)", -link_desc:"Insert/edit link", -unlink_desc:"Unlink", -image_desc:"Insert/edit image", -cleanup_desc:"Cleanup messy code", -code_desc:"Edit HTML Source", -sub_desc:"Subscript", -sup_desc:"Superscript", -hr_desc:"Insert horizontal ruler", -removeformat_desc:"Remove formatting", -custom1_desc:"Your custom description here", -forecolor_desc:"Select text color", -backcolor_desc:"Select background color", -charmap_desc:"Insert custom character", -visualaid_desc:"Toggle guidelines/invisible elements", -anchor_desc:"Insert/edit anchor", -cut_desc:"Cut", -copy_desc:"Copy", -paste_desc:"Paste", -image_props_desc:"Image properties", -newdocument_desc:"New document", -help_desc:"Help", -blockquote_desc:"Blockquote", -clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?", -path:"Path", -newdocument:"Are you sure you want clear all contents?", -toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", -more_colors:"More colors", - -// Accessibility Strings -shortcuts_desc:'Accessibility Help', -help_shortcut:'. Press ALT F10 for toolbar. Press ALT 0 for help.', -rich_text_area:"Rich Text Area", -toolbar:"Toolbar" -}); diff --git a/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js b/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js deleted file mode 100644 index 0a459beb5c..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/langs/en_dlg.js +++ /dev/null @@ -1,54 +0,0 @@ -tinyMCE.addI18n('en.advanced_dlg',{ -about_title:"About TinyMCE", -about_general:"About", -about_help:"Help", -about_license:"License", -about_plugins:"Plugins", -about_plugin:"Plugin", -about_author:"Author", -about_version:"Version", -about_loaded:"Loaded plugins", -anchor_title:"Insert/edit anchor", -anchor_name:"Anchor name", -anchor_invalid:"Please specify a valid anchor name.", -code_title:"HTML Source Editor", -code_wordwrap:"Word wrap", -colorpicker_title:"Select a color", -colorpicker_picker_tab:"Picker", -colorpicker_picker_title:"Color picker", -colorpicker_palette_tab:"Palette", -colorpicker_palette_title:"Palette colors", -colorpicker_named_tab:"Named", -colorpicker_named_title:"Named colors", -colorpicker_color:"Color:", -colorpicker_name:"Name:", -charmap_title:"Select custom character", -image_title:"Insert/edit image", -image_src:"Image URL", -image_alt:"Image description", -image_list:"Image list", -image_border:"Border", -image_dimensions:"Dimensions", -image_vspace:"Vertical space", -image_hspace:"Horizontal space", -image_align:"Alignment", -image_align_baseline:"Baseline", -image_align_top:"Top", -image_align_middle:"Middle", -image_align_bottom:"Bottom", -image_align_texttop:"Text top", -image_align_textbottom:"Text bottom", -image_align_left:"Left", -image_align_right:"Right", -link_title:"Insert/edit link", -link_url:"Link URL", -link_target:"Target", -link_target_same:"Open link in the same window", -link_target_blank:"Open link in a new window", -link_titlefield:"Title", -link_is_email:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", -link_is_external:"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?", -link_list:"Link list", -accessibility_help:"Accessibility Help", -accessibility_usage_title:"General Usage" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/advanced/link.htm b/plugins/TinyMCE/js/themes/advanced/link.htm deleted file mode 100644 index 5d9dea9b8c..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/link.htm +++ /dev/null @@ -1,57 +0,0 @@ - - - - {#advanced_dlg.link_title} - - - - - - - -
    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
     
    -
    -
    - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/shortcuts.htm b/plugins/TinyMCE/js/themes/advanced/shortcuts.htm deleted file mode 100644 index 20ec2f5a34..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/shortcuts.htm +++ /dev/null @@ -1,47 +0,0 @@ - - - - {#advanced_dlg.accessibility_help} - - - - -

    {#advanced_dlg.accessibility_usage_title}

    -

    Toolbars

    -

    Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. - Press enter to activate a button and return focus to the editor. - Press escape to return focus to the editor without performing any actions.

    - -

    Status Bar

    -

    To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. - Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

    - -

    Context Menu

    -

    Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. - To close submenus press the left arrow key. Press escape to close the context menu.

    - -

    Keyboard Shortcuts

    - - - - - - - - - - - - - - - - - - - - - -
    KeystrokeFunction
    Control-BBold
    Control-IItalic
    Control-ZUndo
    Control-YRedo
    - - diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/content.css b/plugins/TinyMCE/js/themes/advanced/skins/default/content.css deleted file mode 100644 index 569a3ae8c7..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/default/content.css +++ /dev/null @@ -1,47 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} - -.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} -.mceItemShockWave {background-image:url(../../img/shockwave.gif)} -.mceItemFlash {background-image:url(../../img/flash.gif)} -.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} -.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} -.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} -.mceItemVideo {background-image:url(../../img/video.gif)} -.mceItemIframe {background-image:url(../../img/iframe.gif)} -.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/default/dialog.css deleted file mode 100644 index f01222650e..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/default/dialog.css +++ /dev/null @@ -1,117 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(img/buttons.png) 0 -52px} -#cancel {background:url(img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png b/plugins/TinyMCE/js/themes/advanced/skins/default/img/buttons.png deleted file mode 100644 index 1e53560e0aa7bb1b9a0373fc2f330acab7d1d51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3133 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 XtZb~ra4Vor00000NkvXXu0mjf(5kL( diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/items.gif deleted file mode 100644 index d2f93671ca3090b277e16a67b1aa6cfb6ac4915f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbhEHbjEB<5wG8q|kKzxu41Cw-5|H{*E`4`XOxxoD9Y}F^Z SLTQbO*E^TJI;F+RU=09Vu@yA{ diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_check.gif b/plugins/TinyMCE/js/themes/advanced/skins/default/img/menu_check.gif deleted file mode 100644 index adfdddccd7cac62a17d68873fa53c248bff8351a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 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 diff --git a/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css b/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css deleted file mode 100644 index 2b7c2a59a9..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/default/ui.css +++ /dev/null @@ -1,214 +0,0 @@ -/* Reset */ -.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} -.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} -.defaultSkin table td {vertical-align:middle} - -/* Containers */ -.defaultSkin table {direction:ltr;background:transparent} -.defaultSkin iframe {display:block;} -.defaultSkin .mceToolbar {height:26px} -.defaultSkin .mceLeft {text-align:left} -.defaultSkin .mceRight {text-align:right} - -/* External */ -.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} -.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} - -/* Layout */ -.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} -.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} -.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} -.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} -.defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top} -.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} -.defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} -.defaultSkin .mceStatusbar div {float:left; margin:2px} -.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} -.defaultSkin .mceStatusbar a:hover {text-decoration:underline} -.defaultSkin table.mceToolbar {margin-left:3px} -.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} -.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} -.defaultSkin td.mceCenter {text-align:center;} -.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} -.defaultSkin td.mceRight table {margin:0 0 0 auto;} - -/* Button */ -.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} -.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.defaultSkin .mceButtonLabeled {width:auto} -.defaultSkin .mceButtonLabeled span.mceIcon {float:left} -.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} -.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} - -/* Separator */ -.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} - -/* ListBox */ -.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} -.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} -.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} -.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} -.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} -.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} -.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} -.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} -.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} -.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} - -/* SplitButton */ -.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} -.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} -.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} -.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} -.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} -.defaultSkin .mceSplitButton span.mceOpen {display:none} -.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} -.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} -.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} - -/* ColorSplitButton */ -.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} -.defaultSkin .mceColorSplitMenu td {padding:2px} -.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} -.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} -.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} -.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} -.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} - -/* Menu */ -.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} -.defaultSkin .mceNoIcons span.mceIcon {width:0;} -.defaultSkin .mceNoIcons a .mceText {padding-left:10px} -.defaultSkin .mceMenu table {background:#FFF} -.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} -.defaultSkin .mceMenu td {height:20px} -.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} -.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} -.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} -.defaultSkin .mceMenu pre.mceText {font-family:Monospace} -.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} -.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} -.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} -.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} -.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} -.defaultSkin .mceMenuItemDisabled .mceText {color:#888} -.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} -.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} -.defaultSkin .mceMenu span.mceMenuLine {display:none} -.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} -.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal} - -/* Progress,Resize */ -.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} -.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.defaultSkin .mce_formatPreview a {font-size:10px} -.defaultSkin .mce_p span.mceText {} -.defaultSkin .mce_address span.mceText {font-style:italic} -.defaultSkin .mce_pre span.mceText {font-family:monospace} -.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} - -/* Theme */ -.defaultSkin span.mce_bold {background-position:0 0} -.defaultSkin span.mce_italic {background-position:-60px 0} -.defaultSkin span.mce_underline {background-position:-140px 0} -.defaultSkin span.mce_strikethrough {background-position:-120px 0} -.defaultSkin span.mce_undo {background-position:-160px 0} -.defaultSkin span.mce_redo {background-position:-100px 0} -.defaultSkin span.mce_cleanup {background-position:-40px 0} -.defaultSkin span.mce_bullist {background-position:-20px 0} -.defaultSkin span.mce_numlist {background-position:-80px 0} -.defaultSkin span.mce_justifyleft {background-position:-460px 0} -.defaultSkin span.mce_justifyright {background-position:-480px 0} -.defaultSkin span.mce_justifycenter {background-position:-420px 0} -.defaultSkin span.mce_justifyfull {background-position:-440px 0} -.defaultSkin span.mce_anchor {background-position:-200px 0} -.defaultSkin span.mce_indent {background-position:-400px 0} -.defaultSkin span.mce_outdent {background-position:-540px 0} -.defaultSkin span.mce_link {background-position:-500px 0} -.defaultSkin span.mce_unlink {background-position:-640px 0} -.defaultSkin span.mce_sub {background-position:-600px 0} -.defaultSkin span.mce_sup {background-position:-620px 0} -.defaultSkin span.mce_removeformat {background-position:-580px 0} -.defaultSkin span.mce_newdocument {background-position:-520px 0} -.defaultSkin span.mce_image {background-position:-380px 0} -.defaultSkin span.mce_help {background-position:-340px 0} -.defaultSkin span.mce_code {background-position:-260px 0} -.defaultSkin span.mce_hr {background-position:-360px 0} -.defaultSkin span.mce_visualaid {background-position:-660px 0} -.defaultSkin span.mce_charmap {background-position:-240px 0} -.defaultSkin span.mce_paste {background-position:-560px 0} -.defaultSkin span.mce_copy {background-position:-700px 0} -.defaultSkin span.mce_cut {background-position:-680px 0} -.defaultSkin span.mce_blockquote {background-position:-220px 0} -.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} -.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} -.defaultSkin span.mce_forecolorpicker {background-position:-720px 0} -.defaultSkin span.mce_backcolorpicker {background-position:-760px 0} - -/* Plugins */ -.defaultSkin span.mce_advhr {background-position:-0px -20px} -.defaultSkin span.mce_ltr {background-position:-20px -20px} -.defaultSkin span.mce_rtl {background-position:-40px -20px} -.defaultSkin span.mce_emotions {background-position:-60px -20px} -.defaultSkin span.mce_fullpage {background-position:-80px -20px} -.defaultSkin span.mce_fullscreen {background-position:-100px -20px} -.defaultSkin span.mce_iespell {background-position:-120px -20px} -.defaultSkin span.mce_insertdate {background-position:-140px -20px} -.defaultSkin span.mce_inserttime {background-position:-160px -20px} -.defaultSkin span.mce_absolute {background-position:-180px -20px} -.defaultSkin span.mce_backward {background-position:-200px -20px} -.defaultSkin span.mce_forward {background-position:-220px -20px} -.defaultSkin span.mce_insert_layer {background-position:-240px -20px} -.defaultSkin span.mce_insertlayer {background-position:-260px -20px} -.defaultSkin span.mce_movebackward {background-position:-280px -20px} -.defaultSkin span.mce_moveforward {background-position:-300px -20px} -.defaultSkin span.mce_media {background-position:-320px -20px} -.defaultSkin span.mce_nonbreaking {background-position:-340px -20px} -.defaultSkin span.mce_pastetext {background-position:-360px -20px} -.defaultSkin span.mce_pasteword {background-position:-380px -20px} -.defaultSkin span.mce_selectall {background-position:-400px -20px} -.defaultSkin span.mce_preview {background-position:-420px -20px} -.defaultSkin span.mce_print {background-position:-440px -20px} -.defaultSkin span.mce_cancel {background-position:-460px -20px} -.defaultSkin span.mce_save {background-position:-480px -20px} -.defaultSkin span.mce_replace {background-position:-500px -20px} -.defaultSkin span.mce_search {background-position:-520px -20px} -.defaultSkin span.mce_styleprops {background-position:-560px -20px} -.defaultSkin span.mce_table {background-position:-580px -20px} -.defaultSkin span.mce_cell_props {background-position:-600px -20px} -.defaultSkin span.mce_delete_table {background-position:-620px -20px} -.defaultSkin span.mce_delete_col {background-position:-640px -20px} -.defaultSkin span.mce_delete_row {background-position:-660px -20px} -.defaultSkin span.mce_col_after {background-position:-680px -20px} -.defaultSkin span.mce_col_before {background-position:-700px -20px} -.defaultSkin span.mce_row_after {background-position:-720px -20px} -.defaultSkin span.mce_row_before {background-position:-740px -20px} -.defaultSkin span.mce_merge_cells {background-position:-760px -20px} -.defaultSkin span.mce_table_props {background-position:-980px -20px} -.defaultSkin span.mce_row_props {background-position:-780px -20px} -.defaultSkin span.mce_split_cells {background-position:-800px -20px} -.defaultSkin span.mce_template {background-position:-820px -20px} -.defaultSkin span.mce_visualchars {background-position:-840px -20px} -.defaultSkin span.mce_abbr {background-position:-860px -20px} -.defaultSkin span.mce_acronym {background-position:-880px -20px} -.defaultSkin span.mce_attribs {background-position:-900px -20px} -.defaultSkin span.mce_cite {background-position:-920px -20px} -.defaultSkin span.mce_del {background-position:-940px -20px} -.defaultSkin span.mce_ins {background-position:-960px -20px} -.defaultSkin span.mce_pagebreak {background-position:0 -40px} -.defaultSkin span.mce_restoredraft {background-position:-20px -40px} -.defaultSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css deleted file mode 100644 index c2e30c7a2b..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/content.css +++ /dev/null @@ -1,23 +0,0 @@ -body, td, pre { margin:8px;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css deleted file mode 100644 index b2ed097cd0..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/dialog.css +++ /dev/null @@ -1,105 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -background:#F0F0EE; -color: black; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE; color:#000;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;background-color:transparent;} -a:hover {color:#2B6FB6;background-color:transparent;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;background-color:transparent;} -input.invalid {border:1px solid #EE0000;background-color:transparent;} -input {background:#FFF; border:1px solid #CCC;color:black;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -font-weight:bold; -width:94px; height:23px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#cancel {float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;} -.tabs li.current {font-weight: bold; margin-right:2px;} -.tabs span {float:left; display:block; padding:0px 10px 0 0;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css b/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css deleted file mode 100644 index a2cfcc393c..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/highcontrast/ui.css +++ /dev/null @@ -1,102 +0,0 @@ -/* Reset */ -.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;} -.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;} -.highcontrastSkin table td {vertical-align:middle} - -.highcontrastSkin .mceIconOnly {display: block !important;} - -/* External */ -.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;} -.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} -.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;} - -/* Layout */ -.highcontrastSkin table.mceLayout {border: 1px solid;} -.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid} -.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline} -.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;} -.highcontrastSkin .mceStatusbar div {float:left} -.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0} - -.highcontrastSkin .mceToolbar td { display: inline-block; float: left;} -.highcontrastSkin .mceToolbar tr { display: block;} -.highcontrastSkin .mceToolbar table { display: block; } - -/* Button */ - -.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;} -.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em} -.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} -.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;} - -/* Separator */ -.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;} - -/* ListBox */ -.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;} -.highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;} -.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} -.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} -.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} -.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;} -.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;} - -.highcontrastSkin .mceListBoxMenu {overflow-y:auto} - -/* SplitButton */ -.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} - -.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;} -.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;} -.highcontrastSkin .mceSplitButton tr { display: table-row; } -.highcontrastSkin table.mceSplitButton { display: table; } -.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} -.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} -.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } -.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;} -.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;} - -/* Menu */ -.highcontrastSkin .mceNoIcons span.mceIcon {width:0;} -.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; } -.highcontrastSkin .mceMenu table {background:white; color: black} -.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px} -.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black} -.highcontrastSkin .mceMenu td {height:2em} -.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;} -.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;} -.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace} -.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;} -.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px} -.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid} -.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px} -.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";} -.highcontrastSkin .mceMenu span.mceMenuLine {display:none} -.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"} -.highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal} - -/* ColorSplitButton */ -.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000} -.highcontrastSkin .mceColorSplitMenu td {padding:2px} -.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;} -.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} -.highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} -.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2} -.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;} -.highcontrastSkin .mceColorPreview {display:none;} -.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden} - -/* Progress,Resize */ -.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} -.highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} - -/* Formats */ -.highcontrastSkin .mce_p span.mceText {} -.highcontrastSkin .mce_address span.mceText {font-style:italic} -.highcontrastSkin .mce_pre span.mceText {font-family:monospace} -.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} -.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} -.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} -.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} -.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} -.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css deleted file mode 100644 index 4ac4e4dfb3..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/content.css +++ /dev/null @@ -1,46 +0,0 @@ -body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} -body {background:#FFF;} -body.mceForceColors {background:#FFF; color:#000;} -h1 {font-size: 2em} -h2 {font-size: 1.5em} -h3 {font-size: 1.17em} -h4 {font-size: 1em} -h5 {font-size: .83em} -h6 {font-size: .75em} -.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} -a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} -span.mceItemNbsp {background: #DDD} -td.mceSelected, th.mceSelected {background-color:#3399ff !important} -img {border:0;} -table {cursor:default} -table td, table th {cursor:text} -ins {border-bottom:1px solid green; text-decoration: none; color:green} -del {color:red; text-decoration:line-through} -cite {border-bottom:1px dashed blue} -acronym {border-bottom:1px dotted #CCC; cursor:help} -abbr {border-bottom:1px dashed #CCC; cursor:help} - -/* IE */ -* html body { -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -} - -img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} -font[face=mceinline] {font-family:inherit !important} - -.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} -.mceItemShockWave {background-image:url(../../img/shockwave.gif)} -.mceItemFlash {background-image:url(../../img/flash.gif)} -.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} -.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} -.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} -.mceItemVideo {background-image:url(../../img/video.gif)} -.mceItemIframe {background-image:url(../../img/iframe.gif)} -.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css deleted file mode 100644 index ec08772248..0000000000 --- a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/dialog.css +++ /dev/null @@ -1,117 +0,0 @@ -/* Generic */ -body { -font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; -scrollbar-3dlight-color:#F0F0EE; -scrollbar-arrow-color:#676662; -scrollbar-base-color:#F0F0EE; -scrollbar-darkshadow-color:#DDDDDD; -scrollbar-face-color:#E0E0DD; -scrollbar-highlight-color:#F0F0EE; -scrollbar-shadow-color:#F0F0EE; -scrollbar-track-color:#F5F5F5; -background:#F0F0EE; -padding:0; -margin:8px 8px 0 8px; -} - -html {background:#F0F0EE;} -td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -textarea {resize:none;outline:none;} -a:link, a:visited {color:black;} -a:hover {color:#2B6FB6;} -.nowrap {white-space: nowrap} - -/* Forms */ -fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #CCC;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #808080;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, #cancel, input.button, .updateButton { -border:0; margin:0; padding:0; -font-weight:bold; -width:94px; height:26px; -background:url(../default/img/buttons.png) 0 -26px; -cursor:pointer; -padding-bottom:2px; -float:left; -} - -#insert {background:url(../default/img/buttons.png) 0 -52px} -#cancel {background:url(../default/img/buttons.png) 0 0; float:right} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -a.pickcolor:hover span.disabled {} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} -.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} -.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg.png deleted file mode 100644 index 13a5cb03097c004f7b37658654a9250748cf073c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2766 zcmd^B`#;nBAK!9c(dCSc_`04XBu+J597MXvt(oeZlcJpHIOSO7atc#AMWG$3$V7)q zNx38nEwRmIE*oapX3E%2Y_rQ}@3ZgU@qIsD@7L?`e7_#g=kxt|zu!N+{|XHbG)7n; zU@(~Rf&KpB+Imzw{S0-qnWxWD!C*SD&>&2J76Jgq`yNnO3$>r8@B|Y69x0pfIh#Ow z)WjyX^8T)+6I-}NwZreI-$r>-HeZJQv#zX#Th_uMwsMIrlO4mNj{|cbX#CdxSrSA1 zi7x6G7Jj7hJB9?EBN7TrO5@0TC%zA`m*~?n<~POISNRA}Ix(kW@s(5astLYgTBw@h z%VrlKo=`C@ST1R1m9LYgOf7Md z%vzvMe5Z_y2DwWEoJHD{xNkz(%My(67Mb6qJc(v%ez|*GL}7^sxZ0gBO!Bo{;Q&WM zV~hKzM04L20BA!600h)@pk@MPCs0oSH5X{4K+yx#GXN3-jT}guz%o@MqX6}sMoQL5 zDbQRgH1}A|FIDkNfw)Q|r2+XcBpuQyW`K$hDQ1Cc9;n4YEdkIH;ALod*EG}Dz-$rp zodRS-8tD*F2^9QBm7ql>XjO|zDiH~iGQlzzD86d`M;8Iw0Wf$N3>*f7!C)X53}FF1 zT0@Toj5C077L3FL<|Sw<4{-A#&RxJIKpX-MAm?_cBlxb#&;M-FLuSz*n4d&h` zXWyvinw0!TAZh`kHX!Z*ViJ&afdz_MOab5f!Qzm5fd-Zs&>|hkCV+ej$T>j02*z+= z>_u@$tA>DwJ(UpDP?lurK+A9mzvO(D-+gFH)8MEW*O2c>3^gu}@HCz3w3$-%Bg0iD72j)nmts zO~01P6^cappH!;k{M1!%*t$nQ=-$~$cX+fEkj^3P+$d^La54PkS=(gpNkdn~8?D*hW^hb50#Qbv(Vr z7mux=@03*OzkBFr1euY0!)>k{MMqGw8F#U zRe``TW;?0PDm5oCUDqnyR2D|VTUKrljh??&VAFx_Y8>n0){SLYN4rN@58&~EY<8F( z0{QSBO|7FRtIxB?ykG0dfo2c-Y&e&zlYMnqkV9vq+=EwnBv2HB%MeBD4xS7LeKIpT_! z`x2_k`zl`LzeQ$W8QpB(KQ+0LVyEJr9M?0CO4qCq-VU);<`uj}<}S1&Q7xSe=5T(8 ziLmqu&AMuP>etg&fo)XY<9~c4ufJu@Ux>Osj0^B-);#sZ?RMt%g}dL*c}ZebdsbpF zCGfuwrDfcoU0*mJ)RD4V;PPr$+Lrfm`b7p-cJd8)xqdLm^ZH#<*JQfYJ~PoB*LK5| zH$C3CzsVSRfseg&M51H8?1)k+yOYwqQqn)B#!aMev)#63aXG;9DDJn_0c)Gxymon< zymu+j@mLckYTb1Up+$oES-Qj(fgx}5+7lCfvmr6-7IAsgPaDgPES=EUr(Q2%O-m}?RmP5S6{I{NuN(T6$1*`X7IJXi>l zhX)mey1{@?Zefvr;ZbWC>l|x544h)bavSVvqawV&>mHYcaIE7arJsyhy0aAZ28%Ea^Z`=aTvh4miaaN0)5vL*wCb?j}Dsf4O@AD!~!zsLr>lt6x7K z3`4aaD)%xv?5(p|tKkpFdnS6dqgrLbo&zQ4gEPu=g5tj(#rWP>nDR~6@jTSz^oix< mOkD9tMJf;J-L)*xtX8`HcJ}PmJwolr6m}pW*#DJZbk@H_2$Vel diff --git a/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png b/plugins/TinyMCE/js/themes/advanced/skins/o2k7/img/button_bg_black.png deleted file mode 100644 index 7fc57f2bc2d63a3ad6fbf98b663f336539f011ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 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 O0000 - - {#advanced_dlg.code_title} - - - - -
    -
    - -
    - -
    - -
    - - - -
    - - -
    -
    - - diff --git a/plugins/TinyMCE/js/themes/simple/editor_template.js b/plugins/TinyMCE/js/themes/simple/editor_template.js deleted file mode 100644 index 4b3209cc92..0000000000 --- a/plugins/TinyMCE/js/themes/simple/editor_template.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.contentCSS.push(d+"/skins/"+f.skin+"/content.css");c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})})});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/simple/editor_template_src.js b/plugins/TinyMCE/js/themes/simple/editor_template_src.js deleted file mode 100644 index 01ce87c58a..0000000000 --- a/plugins/TinyMCE/js/themes/simple/editor_template_src.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * editor_template_src.js - * - * Copyright 2009, Moxiecode Systems AB - * Released under LGPL License. - * - * License: http://tinymce.moxiecode.com/license - * Contributing: http://tinymce.moxiecode.com/contributing - */ - -(function() { - var DOM = tinymce.DOM; - - // Tell it to load theme specific language pack(s) - tinymce.ThemeManager.requireLangPack('simple'); - - tinymce.create('tinymce.themes.SimpleTheme', { - init : function(ed, url) { - var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; - - t.editor = ed; - ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css"); - - ed.onInit.add(function() { - ed.onNodeChange.add(function(ed, cm) { - tinymce.each(states, function(c) { - cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); - }); - }); - }); - - DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); - }, - - renderUI : function(o) { - var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; - - n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); - n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); - n = tb = DOM.add(n, 'tbody'); - - // Create iframe container - n = DOM.add(tb, 'tr'); - n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); - - // Create toolbar container - n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); - - // Create toolbar - tb = t.toolbar = cf.createToolbar("tools1"); - tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); - tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); - tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); - tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); - tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); - tb.add(cf.createSeparator()); - tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); - tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); - tb.renderTo(n); - - return { - iframeContainer : ic, - editorContainer : ed.id + '_container', - sizeContainer : sc, - deltaHeight : -20 - }; - }, - - getInfo : function() { - return { - longname : 'Simple theme', - author : 'Moxiecode Systems AB', - authorurl : 'http://tinymce.moxiecode.com', - version : tinymce.majorVersion + "." + tinymce.minorVersion - } - } - }); - - tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme); -})(); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/simple/img/icons.gif b/plugins/TinyMCE/js/themes/simple/img/icons.gif deleted file mode 100644 index 6fcbcb5dedf16a5fa1d15c2aa127bceb612f1e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmZ?wbhEHbJi#Es@KuxH{{08bHy>kQU|4+kcV*u?6Yu2z|Nk2X_I-c9E~4fBsnb_x z&7Ngzq1inB@Woqi-rnfiGF7yw9zM z^p;~=3MY4TT)2AY!iC=7fBwej_wPS(UDm1P!}|}9?`#au+qhx#R?Fl=KuakHia%Lc z85lGfbU;Rd{N%v)|G<<24;`ug6HAIt=2*?Yu%d)ZG@><(acbwmDSj%f4MMZ#%vkt3 z%+g~)i8kP^LLB_(WJHBo z)4eilyozQ8a&qqSt%<6xpa0;xA7k;M?mchbzI*>+`RnL~M?L!{MDwZt;o_B2F2$0=pQSpQ!u@RcUGT{(44KaY91N#ws_nDH9G%Qf=ZF z5o_THWH`G~`GwyilS^z$ZvV~I`dh4Lx_8c>?R@8gr-07UIgFjp0y#A&c{B)cE>2kS zL5I1;i$zoEA)6qV`HGJvVWE!{8MZ6ST|PC}d%Kid7{KiD{l18xziSGKuWtj9AkWy-*`}#c~0`Lrjq> z-;O-o=3A#@&dst%_SasuJq0xZW;OwR3vM!diY%Es?;J~Pp}LYununP(i|XxU>#u=* zSvNC^0?cJ=S?=UK4&2DdcCO^BsHxjWc4vR-Z64x&8r#>V9!JMd4O!Z*d@mNrgX=jUy;0|T>ZntHjDU$=-I8y`|tN~Y9 diff --git a/plugins/TinyMCE/js/themes/simple/langs/en.js b/plugins/TinyMCE/js/themes/simple/langs/en.js deleted file mode 100644 index 9f08f102fb..0000000000 --- a/plugins/TinyMCE/js/themes/simple/langs/en.js +++ /dev/null @@ -1,11 +0,0 @@ -tinyMCE.addI18n('en.simple',{ -bold_desc:"Bold (Ctrl+B)", -italic_desc:"Italic (Ctrl+I)", -underline_desc:"Underline (Ctrl+U)", -striketrough_desc:"Strikethrough", -bullist_desc:"Unordered list", -numlist_desc:"Ordered list", -undo_desc:"Undo (Ctrl+Z)", -redo_desc:"Redo (Ctrl+Y)", -cleanup_desc:"Cleanup messy code" -}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/themes/simple/skins/default/content.css b/plugins/TinyMCE/js/themes/simple/skins/default/content.css deleted file mode 100644 index 2506c807ca..0000000000 --- a/plugins/TinyMCE/js/themes/simple/skins/default/content.css +++ /dev/null @@ -1,25 +0,0 @@ -body, td, pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -body { - background-color: #FFFFFF; -} - -.mceVisualAid { - border: 1px dashed #BBBBBB; -} - -/* MSIE specific */ - -* html body { - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} diff --git a/plugins/TinyMCE/js/themes/simple/skins/default/ui.css b/plugins/TinyMCE/js/themes/simple/skins/default/ui.css deleted file mode 100644 index 076fe84e34..0000000000 --- a/plugins/TinyMCE/js/themes/simple/skins/default/ui.css +++ /dev/null @@ -1,32 +0,0 @@ -/* Reset */ -.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} - -/* Containers */ -.defaultSimpleSkin {position:relative} -.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} -.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} -.defaultSimpleSkin .mceToolbar {height:24px;} - -/* Layout */ -.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} -.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} - -/* Button */ -.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} -.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} -.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} -.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} - -/* Separator */ -.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} - -/* Theme */ -.defaultSimpleSkin span.mce_bold {background-position:0 0} -.defaultSimpleSkin span.mce_italic {background-position:-60px 0} -.defaultSimpleSkin span.mce_underline {background-position:-140px 0} -.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} -.defaultSimpleSkin span.mce_undo {background-position:-160px 0} -.defaultSimpleSkin span.mce_redo {background-position:-100px 0} -.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} -.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} -.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css b/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css deleted file mode 100644 index 595809fa61..0000000000 --- a/plugins/TinyMCE/js/themes/simple/skins/o2k7/content.css +++ /dev/null @@ -1,17 +0,0 @@ -body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} - -body {background: #FFF;} -.mceVisualAid {border: 1px dashed #BBB;} - -/* IE */ - -* html body { -scrollbar-3dlight-color: #F0F0EE; -scrollbar-arrow-color: #676662; -scrollbar-base-color: #F0F0EE; -scrollbar-darkshadow-color: #DDDDDD; -scrollbar-face-color: #E0E0DD; -scrollbar-highlight-color: #F0F0EE; -scrollbar-shadow-color: #F0F0EE; -scrollbar-track-color: #F5F5F5; -} diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/img/button_bg.png b/plugins/TinyMCE/js/themes/simple/skins/o2k7/img/button_bg.png deleted file mode 100644 index 527e3495a653e57d76bf7e55316793d17dda497a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 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 VmjT$ODWe$zObpERYjs_s{s;8{A&me4 diff --git a/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css b/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css deleted file mode 100644 index cf6c35d109..0000000000 --- a/plugins/TinyMCE/js/themes/simple/skins/o2k7/ui.css +++ /dev/null @@ -1,35 +0,0 @@ -/* Reset */ -.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} - -/* Containers */ -.o2k7SimpleSkin {position:relative} -.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} -.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} -.o2k7SimpleSkin .mceToolbar {height:26px;} - -/* Layout */ -.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } -.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} -.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} -.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} - -/* Button */ -.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} -.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} -.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} -.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} -.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} - -/* Separator */ -.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} - -/* Theme */ -.o2k7SimpleSkin span.mce_bold {background-position:0 0} -.o2k7SimpleSkin span.mce_italic {background-position:-60px 0} -.o2k7SimpleSkin span.mce_underline {background-position:-140px 0} -.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} -.o2k7SimpleSkin span.mce_undo {background-position:-160px 0} -.o2k7SimpleSkin span.mce_redo {background-position:-100px 0} -.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} -.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} -.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} diff --git a/plugins/TinyMCE/js/tiny_mce.js b/plugins/TinyMCE/js/tiny_mce.js deleted file mode 100644 index 6463ba05c1..0000000000 --- a/plugins/TinyMCE/js/tiny_mce.js +++ /dev/null @@ -1 +0,0 @@ -(function(d){var a=/^\s*|\s*$/g,e,c="B".replace(/A(.)|B/,"$1")==="$1";var b={majorVersion:"3",minorVersion:"4.3.1",releaseDate:"2011-06-16",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=d.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(d.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();(function(){function serialize(o,quote){var i,v,t;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(i in o){v+=typeof o[i]!="function"?(v.length>1?","+quote:quote)+i+quote+":"+serialize(o[i],quote):""}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':""","'":"'","<":"<",">":">","&":"&"};d={"<":"<",">":">","&":"&",""":'"',"'":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(r){var y={},p,n,v,q,u=d.url_converter,x=d.url_converter_scope||this;function o(C,F){var E,B,A,D;E=y[C+"-top"+F];if(!E){return}B=y[C+"-right"+F];if(E!=B){return}A=y[C+"-bottom"+F];if(B!=A){return}D=y[C+"-left"+F];if(A!=D){return}y[C+F]=D;delete y[C+"-top"+F];delete y[C+"-right"+F];delete y[C+"-bottom"+F];delete y[C+"-left"+F]}function t(B){var C=y[B],A;if(!C||C.indexOf(" ")<0){return}C=C.split(" ");A=C.length;while(A--){if(C[A]!==C[0]){return false}}y[B]=C[0];return true}function z(C,B,A,D){if(!t(B)){return}if(!t(A)){return}if(!t(D)){return}y[C]=y[B]+" "+y[A]+" "+y[D];delete y[B];delete y[A];delete y[D]}function s(A){q=true;return a[A]}function i(B,A){if(q){B=B.replace(/\uFEFF[0-9]/g,function(C){return a[C]})}if(!A){B=B.replace(/\\([\'\";:])/g,"$1")}return B}if(r){r=r.replace(/\\[\"\';:\uFEFF]/g,s).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(A){return A.replace(/[;:]/g,s)});while(p=b.exec(r)){n=p[1].replace(l,"").toLowerCase();v=p[2].replace(l,"");if(n&&v.length>0){if(n==="font-weight"&&v==="700"){v="bold"}else{if(n==="color"||n==="background-color"){v=v.toLowerCase()}}v=v.replace(k,c);v=v.replace(h,function(B,A,E,D,F,C){F=F||C;if(F){F=i(F);return"'"+F.replace(/\'/g,"\\'")+"'"}A=i(A||E||D);if(u){A=u.call(x,A,"style")}return"url('"+A.replace(/\'/g,"\\'")+"')"});y[n]=q?i(v,true):v}b.lastIndex=p.index+p[0].length}o("border","");o("border","-width");o("border","-color");o("border","-style");o("padding","");o("margin","");z("border","border-width","border-style","border-color");if(y.border==="medium none"){delete y.border}}return y},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(m){var h={},j,l,g,f,c={},b,e,d=m.makeMap,k=m.each;function i(o,n){return o.split(n||",")}function a(r,q){var o,p={};function n(s){return s.replace(/[A-Z]+/g,function(t){return n(r[t])})}for(o in r){if(r.hasOwnProperty(o)){r[o]=n(r[o])}}n(q).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(v,t,s,u){s=i(s,"|");p[t]={attributes:d(s),attributesOrder:s,children:d(u,"|",{"#comment":{}})}});return p}l="h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup";l=d(l,",",d(l.toUpperCase()));h=a({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]");j=d("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls");g=d("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source");f=m.extend(d("td,th,iframe,video,object"),g);b=d("pre,script,style");e=d("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");m.html.Schema=function(q){var y=this,n={},o={},v=[],p;q=q||{};if(q.verify_html===false){q.valid_elements="*[*]"}if(q.valid_styles){p={};k(q.valid_styles,function(A,z){p[z]=m.explode(A)})}function x(z){return new RegExp("^"+z.replace(/([?+*])/g,".$1")+"$")}function s(G){var F,B,U,Q,V,A,D,P,S,L,T,X,J,E,R,z,N,C,W,Y,K,O,I=/^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,M=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,H=/[*?+]/;if(G){G=i(G);if(n["@"]){N=n["@"].attributes;C=n["@"].attributesOrder}for(F=0,B=G.length;F=0){for(P=l.length-1;P>=Q;P--){O=l[P];if(O.valid){A.end(O.name)}}l.length=Q}}D=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)\\s*((?:[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*)>))","g");h=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;g={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};F=e.getShortEndedElements();z=e.getSelfClosingElements();k=e.getBoolAttrs();x=c.validate;y=c.fix_self_closing;while(f=D.exec(q)){if(m0&&l[l.length-1].name===G){C(G)}if(!x||(I=e.getElementRule(G))){r=true;if(x){J=I.attributes;n=I.attributePatterns}if(o=f[8]){B=[];B.map={};o.replace(h,function(P,O,T,S,R){var U,Q;O=O.toLowerCase();T=O in k?O:v(T||S||R||"");if(x&&O.indexOf("data-")!==0){U=J[O];if(!U&&n){Q=n.length;while(Q--){U=n[Q];if(U.pattern.test(O)){break}}if(Q===-1){U=null}}if(!U){return}if(U.validValues&&!(T in U.validValues)){return}}B.map[O]=T;B.push({name:O,value:T})})}else{B=[];B.map={}}if(x){H=I.attributesRequired;M=I.attributesDefault;L=I.attributesForced;if(L){K=L.length;while(K--){E=L[K];N=E.name;u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}if(M){K=M.length;while(K--){E=M[K];N=E.name;if(!(N in B.map)){u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}}if(H){K=H.length;while(K--){if(H[K] in B.map){break}}if(K===-1){r=false}}if(B.map["data-mce-bogus"]){r=false}}if(r){A.start(G,B,p)}}else{r=false}if(j=g[G]){j.lastIndex=m=f.index+f[0].length;if(f=j.exec(q)){if(r){t=q.substr(m,f.index-m)}m=f.index+f[0].length}else{t=q.substr(m);m=q.length}if(r&&t.length>0){A.text(t,true)}if(r){A.end(G)}D.lastIndex=m;continue}if(!p){if(!o||o.indexOf("/")!=o.length-1){l.push({name:G,valid:r})}else{if(r){A.end(G)}}}}else{if(G=f[1]){A.comment(G)}else{if(G=f[2]){A.cdata(G)}else{if(G=f[3]){A.doctype(G)}else{if(G=f[4]){A.pi(G,f[5])}}}}}}m=f.index+f[0].length}if(m=0;K--){G=l[K];if(G.valid){A.end(G.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t0){N.value=l;N=N.prev}else{L=N.prev;N.remove();N=L}}}n=new b.html.SaxParser({validate:y,fix_self_closing:!y,cdata:function(l){A.append(I("#cdata",4)).value=l},text:function(M,l){var L;if(!s[A.name]){M=M.replace(k," ");if(A.lastChild&&o[A.lastChild.name]){M=M.replace(D,"")}}if(M.length!==0){L=I("#text",3);L.raw=!!l;A.append(L).value=M}},comment:function(l){A.append(I("#comment",8)).value=l},pi:function(l,L){A.append(I(l,7)).value=L;G(A)},doctype:function(L){var l;l=A.append(I("#doctype",10));l.value=L;G(A)},start:function(l,T,M){var R,O,N,L,P,U,S,Q;N=y?h.getElementRule(l):{};if(N){R=I(N.outputName||l,1);R.attributes=T;R.shortEnded=M;A.append(R);Q=p[A.name];if(Q&&p[R.name]&&!Q[R.name]){J.push(R)}O=d.length;while(O--){P=d[O].name;if(P in T.map){E=c[P];if(E){E.push(R)}else{c[P]=[R]}}}if(o[l]){G(R)}if(!M){A=R}}},end:function(l){var P,M,O,L,N;M=y?h.getElementRule(l):{};if(M){if(o[l]){if(!s[A.name]){for(P=A.firstChild;P&&P.type===3;){O=P.value.replace(D,"");if(O.length>0){P.value=O;P=P.next}else{L=P.next;P.remove();P=L}}for(P=A.lastChild;P&&P.type===3;){O=P.value.replace(t,"");if(O.length>0){P.value=O;P=P.prev}else{L=P.prev;P.remove();P=L}}}P=A.prev;if(P&&P.type===3){O=P.value.replace(D,"");if(O.length>0){P.value=O}else{P.remove()}}}if(M.removeEmpty||M.paddEmpty){if(A.isEmpty(u)){if(M.paddEmpty){A.empty().append(new a("#text","3")).value="\u00a0"}else{if(!A.attributes.map.name){N=A.parent;A.empty().remove();A=N;return}}}}A=A.parent}}},h);H=A=new a(m.context||g.root_name,11);n.parse(v);if(y&&J.length){if(!m.context){j(J)}else{m.invalid=true}}if(q&&H.name=="body"){F()}if(!m.invalid){for(K in i){E=e[K];z=i[K];x=z.length;while(x--){if(!z[x].parent){z.splice(x,1)}}for(C=0,B=E.length;C0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("")},comment:function(h){c.push("")},pi:function(h,i){if(i){c.push("")}else{c.push("")}if(a){c.push("\n")}},doctype:function(h){c.push("",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n=8;l.boxModel=!h.isIE||o.compatMode=="CSS1Compat"||l.stdMode;l.hasOuterHTML="outerHTML" in o.createElement("a");l.settings=m=h.extend({keep_values:false,hex_colors:1},m);l.schema=m.schema;l.styles=new h.html.Styles({url_converter:m.url_converter,url_converter_scope:m.url_converter_scope},m.schema);if(h.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(n){l.cssFlicker=true}}if(b&&m.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(p){o.createElement(p)});for(k in m.schema.getCustomElements()){o.createElement(k)}}h.addUnload(l.destroy,l)},getRoot:function(){var j=this,k=j.settings;return(k&&j.get(k.root_element))||j.doc.body},getViewPort:function(k){var l,j;k=!k?this.win:k;l=k.document;j=this.boxModel?l.documentElement:l.body;return{x:k.pageXOffset||j.scrollLeft,y:k.pageYOffset||j.scrollTop,w:k.innerWidth||j.clientWidth,h:k.innerHeight||j.clientHeight}},getRect:function(m){var l,j=this,k;m=j.get(m);l=j.getPos(m);k=j.getSize(m);return{x:l.x,y:l.y,w:k.w,h:k.h}},getSize:function(m){var k=this,j,l;m=k.get(m);j=k.getStyle(m,"width");l=k.getStyle(m,"height");if(j.indexOf("px")===-1){j=0}if(l.indexOf("px")===-1){l=0}return{w:parseInt(j)||m.offsetWidth||m.clientWidth,h:parseInt(l)||m.offsetHeight||m.clientHeight}},getParent:function(l,k,j){return this.getParents(l,k,j,false)},getParents:function(u,p,l,s){var k=this,j,m=k.settings,q=[];u=k.get(u);s=s===undefined;if(m.strict_root){l=l||k.getRoot()}if(e(p,"string")){j=p;if(p==="*"){p=function(o){return o.nodeType==1}}else{p=function(o){return k.is(o,j)}}}while(u){if(u==l||!u.nodeType||u.nodeType===9){break}if(!p||p(u)){if(s){q.push(u)}else{return u}}u=u.parentNode}return s?q:null},get:function(j){var k;if(j&&this.doc&&typeof(j)=="string"){k=j;j=this.doc.getElementById(j);if(j&&j.id!==k){return this.doc.getElementsByName(k)[1]}}return j},getNext:function(k,j){return this._findSib(k,j,"nextSibling")},getPrev:function(k,j){return this._findSib(k,j,"previousSibling")},select:function(l,k){var j=this;return h.dom.Sizzle(l,j.get(k)||j.get(j.settings.root_element)||j.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(a.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return h.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(m,q,j,l,o){var k=this;return this.run(m,function(s){var r,n;r=e(q,"string")?k.doc.createElement(q):q;k.setAttribs(r,j);if(l){if(l.nodeType){r.appendChild(l)}else{k.setHTML(r,l)}}return !o?s.appendChild(r):r})},create:function(l,j,k){return this.add(this.doc.createElement(l),l,j,k,1)},createHTML:function(r,j,p){var q="",m=this,l;q+="<"+r;for(l in j){if(j.hasOwnProperty(l)){q+=" "+l+'="'+m.encode(j[l])+'"'}}if(typeof(p)!="undefined"){return q+">"+p+""}return q+" />"},remove:function(j,k){return this.run(j,function(m){var n,l=m.parentNode;if(!l){return null}if(k){while(n=m.firstChild){if(!h.isIE||n.nodeType!==3||n.nodeValue){l.insertBefore(n,m)}else{m.removeChild(n)}}}return l.removeChild(m)})},setStyle:function(m,j,k){var l=this;return l.run(m,function(p){var o,n;o=p.style;j=j.replace(/-(\D)/g,function(r,q){return q.toUpperCase()});if(l.pixelStyles.test(j)&&(h.is(k,"number")||/^[\-0-9\.]+$/.test(k))){k+="px"}switch(j){case"opacity":if(b){o.filter=k===""?"":"alpha(opacity="+(k*100)+")";if(!m.currentStyle||!m.currentStyle.hasLayout){o.display="inline-block"}}o[j]=o["-moz-opacity"]=o["-khtml-opacity"]=k||"";break;case"float":b?o.styleFloat=k:o.cssFloat=k;break;default:o[j]=k||""}if(l.settings.update_styles){l.setAttrib(p,"data-mce-style")}})},getStyle:function(m,j,l){m=this.get(m);if(!m){return}if(this.doc.defaultView&&l){j=j.replace(/[A-Z]/g,function(n){return"-"+n});try{return this.doc.defaultView.getComputedStyle(m,null).getPropertyValue(j)}catch(k){return null}}j=j.replace(/-(\D)/g,function(o,n){return n.toUpperCase()});if(j=="float"){j=b?"styleFloat":"cssFloat"}if(m.currentStyle&&l){return m.currentStyle[j]}return m.style?m.style[j]:undefined},setStyles:function(m,n){var k=this,l=k.settings,j;j=l.update_styles;l.update_styles=0;f(n,function(o,p){k.setStyle(m,p,o)});l.update_styles=j;if(l.update_styles){k.setAttrib(m,l.cssText)}},removeAllAttribs:function(j){return this.run(j,function(m){var l,k=m.attributes;for(l=k.length-1;l>=0;l--){m.removeAttributeNode(k.item(l))}})},setAttrib:function(l,m,j){var k=this;if(!l||!m){return}if(k.settings.strict){m=m.toLowerCase()}return this.run(l,function(o){var n=k.settings;switch(m){case"style":if(!e(j,"string")){f(j,function(p,q){k.setStyle(o,q,p)});return}if(n.keep_values){if(j&&!k._isRes(j)){o.setAttribute("data-mce-style",j,2)}else{o.removeAttribute("data-mce-style",2)}}o.style.cssText=j;break;case"class":o.className=j||"";break;case"src":case"href":if(n.keep_values){if(n.url_converter){j=n.url_converter.call(n.url_converter_scope||k,j,m,o)}k.setAttrib(o,"data-mce-"+m,j,2)}break;case"shape":o.setAttribute("data-mce-style",j);break}if(e(j)&&j!==null&&j.length!==0){o.setAttribute(m,""+j,2)}else{o.removeAttribute(m,2)}})},setAttribs:function(k,l){var j=this;return this.run(k,function(m){f(l,function(o,p){j.setAttrib(m,p,o)})})},getAttrib:function(m,o,l){var j,k=this;m=k.get(m);if(!m||m.nodeType!==1){return false}if(!e(l)){l=""}if(/^(src|href|style|coords|shape)$/.test(o)){j=m.getAttribute("data-mce-"+o);if(j){return j}}if(b&&k.props[o]){j=m[k.props[o]];j=j&&j.nodeValue?j.nodeValue:j}if(!j){j=m.getAttribute(o,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(o)){if(m[k.props[o]]===true&&j===""){return o}return j?o:""}if(m.nodeName==="FORM"&&m.getAttributeNode(o)){return m.getAttributeNode(o).nodeValue}if(o==="style"){j=j||m.style.cssText;if(j){j=k.serializeStyle(k.parseStyle(j),m.nodeName);if(k.settings.keep_values&&!k._isRes(j)){m.setAttribute("data-mce-style",j)}}}if(d&&o==="class"&&j){j=j.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(o){case"rowspan":case"colspan":if(j===1){j=""}break;case"size":if(j==="+0"||j===20||j===0){j=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(j===0){j=""}break;case"hspace":if(j===-1){j=""}break;case"maxlength":case"tabindex":if(j===32768||j===2147483647||j==="32768"){j=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(j===65535){return o}return l;case"shape":j=j.toLowerCase();break;default:if(o.indexOf("on")===0&&j){j=h._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+j)}}}return(j!==undefined&&j!==null&&j!=="")?""+j:l},getPos:function(s,m){var k=this,j=0,q=0,o,p=k.doc,l;s=k.get(s);m=m||p.body;if(s){if(s.getBoundingClientRect){s=s.getBoundingClientRect();o=k.boxModel?p.documentElement:p.body;j=s.left+(p.documentElement.scrollLeft||p.body.scrollLeft)-o.clientTop;q=s.top+(p.documentElement.scrollTop||p.body.scrollTop)-o.clientLeft;return{x:j,y:q}}l=s;while(l&&l!=m&&l.nodeType){j+=l.offsetLeft||0;q+=l.offsetTop||0;l=l.offsetParent}l=s.parentNode;while(l&&l!=m&&l.nodeType){j-=l.scrollLeft||0;q-=l.scrollTop||0;l=l.parentNode}}return{x:j,y:q}},parseStyle:function(j){return this.styles.parse(j)},serializeStyle:function(k,j){return this.styles.serialize(k,j)},loadCSS:function(j){var l=this,m=l.doc,k;if(!j){j=""}k=l.select("head")[0];f(j.split(","),function(n){var o;if(l.files[n]){return}l.files[n]=true;o=l.create("link",{rel:"stylesheet",href:h._addVer(n)});if(b&&m.documentMode&&m.recalc){o.onload=function(){if(m.recalc){m.recalc()}o.onload=null}}k.appendChild(o)})},addClass:function(j,k){return this.run(j,function(l){var m;if(!k){return 0}if(this.hasClass(l,k)){return l.className}m=this.removeClass(l,k);return l.className=(m!=""?(m+" "):"")+k})},removeClass:function(l,m){var j=this,k;return j.run(l,function(o){var n;if(j.hasClass(o,m)){if(!k){k=new RegExp("(^|\\s+)"+m+"(\\s+|$)","g")}n=o.className.replace(k," ");n=h.trim(n!=" "?n:"");o.className=n;if(!n){o.removeAttribute("class");o.removeAttribute("className")}return n}return o.className})},hasClass:function(k,j){k=this.get(k);if(!k||!j){return false}return(" "+k.className+" ").indexOf(" "+j+" ")!==-1},show:function(j){return this.setStyle(j,"display","block")},hide:function(j){return this.setStyle(j,"display","none")},isHidden:function(j){j=this.get(j);return !j||j.style.display=="none"||this.getStyle(j,"display")=="none"},uniqueId:function(j){return(!j?"mce_":j)+(this.counter++)},setHTML:function(l,k){var j=this;return j.run(l,function(n){if(b){while(n.firstChild){n.removeChild(n.firstChild)}try{n.innerHTML="
    "+k;n.removeChild(n.firstChild)}catch(m){n=j.create("div");n.innerHTML="
    "+k;f(n.childNodes,function(p,o){if(o){n.appendChild(p)}})}}else{n.innerHTML=k}return k})},getOuterHTML:function(l){var k,j=this;l=j.get(l);if(!l){return null}if(l.nodeType===1&&j.hasOuterHTML){return l.outerHTML}k=(l.ownerDocument||j.doc).createElement("body");k.appendChild(l.cloneNode(true));return k.innerHTML},setOuterHTML:function(m,k,n){var j=this;function l(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){j.insertAfter(s.cloneNode(true),p);s=s.previousSibling}j.remove(p)}return this.run(m,function(p){p=j.get(p);if(p.nodeType==1){n=n||p.ownerDocument||j.doc;if(b){try{if(b&&p.nodeType==1){p.outerHTML=k}else{l(p,k,n)}}catch(o){l(p,k,n)}}else{l(p,k,n)}}})},decode:c.decode,encode:c.encodeAllRaw,insertAfter:function(j,k){k=this.get(k);return this.run(j,function(m){var l,n;l=k.parentNode;n=k.nextSibling;if(n){l.insertBefore(m,n)}else{l.appendChild(m)}return m})},isBlock:function(k){var j=k.nodeType;if(j){return !!(j===1&&g[k.nodeName])}return !!g[k]},replace:function(p,m,j){var l=this;if(e(m,"array")){p=p.cloneNode(true)}return l.run(m,function(k){if(j){f(h.grep(k.childNodes),function(n){p.appendChild(n)})}return k.parentNode.replaceChild(p,k)})},rename:function(m,j){var l=this,k;if(m.nodeName!=j.toUpperCase()){k=l.create(j);f(l.getAttribs(m),function(n){l.setAttrib(k,n.nodeName,l.getAttrib(m,n.nodeName))});l.replace(k,m,1)}return k||m},findCommonAncestor:function(l,j){var m=l,k;while(m){k=j;while(k&&m!=k){k=k.parentNode}if(m==k){break}m=m.parentNode}if(!m&&l.ownerDocument){return l.ownerDocument.documentElement}return m},toHex:function(j){var l=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(j);function k(m){m=parseInt(m).toString(16);return m.length>1?m:"0"+m}if(l){j="#"+k(l[1])+k(l[2])+k(l[3]);return j}return j},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(r){f(r.imports,function(s){q(s)});f(r.cssRules||r.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){f(s.selectorText.split(","),function(t){t=t.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(t)||!/\.[\w\-]+$/.test(t)){return}l=t;t=h._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",t);if(p&&!(t=p(t,l))){return}if(!o[t]){j.push({"class":t});o[t]=1}})}break;case 3:q(s.styleSheet);break}})}try{f(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(m,l,k){var j=this,n;if(j.doc&&typeof(m)==="string"){m=j.get(m)}if(!m){return false}k=k||this;if(!m.nodeType&&(m.length||m.length===0)){n=[];f(m,function(p,o){if(p){if(typeof(p)=="string"){p=j.doc.getElementById(p)}n.push(l.call(k,p,o))}});return n}return l.call(k,m)},getAttribs:function(k){var j;k=this.get(k);if(!k){return[]}if(b){j=[];if(k.nodeName=="OBJECT"){return k.attributes}if(k.nodeName==="OPTION"&&this.getAttrib(k,"selected")){j.push({specified:1,nodeName:"selected"})}k.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(l){j.push({specified:1,nodeName:l})});return j}return k.attributes},isEmpty:function(o,p){var k=this,m,j,n,q,l;o=o.firstChild;if(o){q=new h.dom.TreeWalker(o);p=p||k.schema?k.schema.getNonEmptyElements():null;do{n=o.nodeType;if(n===1){if(o.getAttribute("data-mce-bogus")){continue}if(p&&p[o.nodeName.toLowerCase()]){return false}j=k.getAttribs(o);m=o.attributes.length;while(m--){l=o.attributes[m].nodeName;if(l==="name"||l.indexOf("data-")===0){return false}}}if((n===3&&!i.test(o.nodeValue))){return false}}while(o=q.next())}return true},destroy:function(k){var j=this;if(j.events){j.events.destroy()}j.win=j.doc=j.root=j.events=null;if(!k){h.removeUnload(j.destroy)}},createRng:function(){var j=this.doc;return j.createRange?j.createRange():new h.dom.Range(this)},nodeIndex:function(n,o){var j=0,l,m,k;if(n){for(l=n.nodeType,n=n.previousSibling,m=n;n;n=n.previousSibling){k=n.nodeType;if(o&&k==3){if(k==l||!n.nodeValue.length){continue}}j++;l=k}}return j},split:function(n,m,q){var s=this,j=s.createRng(),o,l,p;function k(v){var t,r=v.childNodes,u=v.nodeType;if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){k(r[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){if(!s.isBlock(v.parentNode)||h.trim(v.nodeValue).length>0){return}}else{if(u==1){r=v.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(r[0],v)}if(r.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}s.remove(v)}return v}if(n&&m){j.setStart(n.parentNode,s.nodeIndex(n));j.setEnd(m.parentNode,s.nodeIndex(m));o=j.extractContents();j=s.createRng();j.setStart(m.parentNode,s.nodeIndex(m)+1);j.setEnd(n.parentNode,s.nodeIndex(n)+1);l=j.extractContents();p=n.parentNode;p.insertBefore(k(o),n);if(q){p.replaceChild(q,m)}else{p.insertBefore(m,n)}p.insertBefore(k(l),n);s.remove(n);return q||m}},bind:function(n,j,m,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.add(n,j,m,l||this)},unbind:function(m,j,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.remove(m,j,l)},_findSib:function(m,j,k){var l=this,n=j;if(m){if(e(n,"string")){n=function(o){return l.is(o,j)}}for(m=m[k];m;m=m[k]){if(n(m)){return m}}}return null},_isRes:function(j){return/^(top|left|bottom|right|width|height)/i.test(j)||/;\s*(top|left|bottom|right|width|height)/i.test(j)}});h.DOM=new h.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(Y,t){var ab=N[h],W=N[U],aa=N[P],V=N[z],Z=t.startContainer,ad=t.startOffset,X=t.endContainer,ac=t.endOffset;if(Y===0){return G(ab,W,Z,ad)}if(Y===1){return G(aa,V,Z,ad)}if(Y===2){return G(aa,V,X,ac)}if(Y===3){return G(ab,W,X,ac)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}k.setEndPoint(j?"EndToStart":"EndToEnd",i);if(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)>0){k=i.duplicate();k.collapse(j);o=-1;while(s==k.parentElement()){if(k.move("character",-1)==0){break}o++}}o=o||k.text.replace("\r\n"," ").length}else{k.collapse(true);k.setEndPoint(j?"StartToStart":"StartToEnd",i);o=k.text.replace("\r\n"," ").length}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var u,t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,s,q,r=d.dom.doc,m=r.body;function j(z){var u,y,t,x,v;t=h.create("a");u=z?k:s;y=z?p:q;x=n.duplicate();if(u==r||u==r.documentElement){u=m;y=0}if(u.nodeType==3){u.parentNode.insertBefore(t,u);x.moveToElementText(t);x.moveStart("character",y);h.remove(t);n.setEndPoint(z?"StartToStart":"EndToEnd",x)}else{v=u.childNodes;if(v.length){if(y>=v.length){h.insertAfter(t,v[v.length-1])}else{u.insertBefore(t,v[y])}x.moveToElementText(t)}else{t=r.createTextNode("\uFEFF");u.appendChild(t);x.moveToElementText(t.parentNode);x.collapse(c)}n.setEndPoint(z?"StartToStart":"EndToEnd",x);h.remove(t)}}k=i.startContainer;p=i.startOffset;s=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==s&&k.nodeType==1&&p==q-1){if(p==q-1){try{l=m.createControlRange();l.addElement(k.childNodes[p]);l.select();return}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return re[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="

    ";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j_';if(f.startContainer==k&&f.endContainer==k){k.body.innerHTML=g}else{f.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=g}else{if(f.createContextualFragment){f.insertNode(f.createContextualFragment(g))}else{m=k.createDocumentFragment();l=k.createElement("div");m.appendChild(l);l.outerHTML=g;f.insertNode(m)}}}j=n.dom.get("__caret");f=k.createRange();f.setStartBefore(j);f.setEndBefore(j);n.setRng(f);n.dom.remove("__caret");try{n.setRng(f)}catch(h){}}else{if(f.item){k.execCommand("Delete",false,null);f=n.getRng()}f.pasteHTML(g)}if(!i.no_events){n.onSetContent.dispatch(n,i)}},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(r,s){var v=this,m=v.dom,g,j,i,n,h,o,p,l="\uFEFF",u;function f(x,y){var t=0;d(m.select(x),function(A,z){if(A==y){t=z}});return t}if(r==2){function k(){var x=v.getRng(true),t=m.getRoot(),y={};function z(C,H){var B=C[H?"startContainer":"endContainer"],G=C[H?"startOffset":"endOffset"],A=[],D,F,E=0;if(B.nodeType==3){if(s){for(D=B.previousSibling;D&&D.nodeType==3;D=D.previousSibling){G+=D.nodeValue.length}}A.push(G)}else{F=B.childNodes;if(G>=F.length&&F.length){E=1;G=Math.max(0,F.length-1)}A.push(v.dom.nodeIndex(F[G],s)+E)}for(;B&&B!=t;B=B.parentNode){A.push(v.dom.nodeIndex(B,s))}return A}y.start=z(x,true);if(!v.isCollapsed()){y.end=z(x)}return y}if(v.tridentSel){return v.tridentSel.getBookmark(r)}return k()}if(r){return{rng:v.getRng()}}g=v.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();u="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();try{g.collapse();g.pasteHTML(''+l+"");if(!n){j.collapse(false);g.moveToElementText(j.parentElement());if(g.compareEndPoints("StartToEnd",j)==0){j.move("character",-1)}j.pasteHTML(''+l+"")}}catch(q){return null}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=v.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_end",style:u},l))}g.collapse(true);g.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_start",style:u},l))}v.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){y=t[0];for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(t[v]>u.length-1){return}x=u[t[v]]}if(x.nodeType===3){y=Math.min(t[0],x.nodeValue.length)}if(x.nodeType===1){y=Math.min(t[0],x.childNodes.length)}if(z){f.setStart(x,y)}else{f.setEnd(x,y)}}return true}if(r.tridentSel){return r.tridentSel.moveToBookmark(n)}if(g(true)&&g()){r.setRng(f)}}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3&&!c.isOpera){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(l.isBlock(t)&&!t.innerHTML){t.innerHTML=!a?'
    ':" "}return t}k("start");k("end");if(j){f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;if(k){f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g)}return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var h=this,g=h.getRng(),i;if(g.item){i=g.item(0);g=h.win.document.body.createTextRange();g.moveToElementText(i)}g.collapse(!!f);h.setRng(g)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(l){var g=this,h,i,k,j=g.win.document;if(l&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():j.createRange())}}catch(f){}if(c.isIE&&i&&i.setStart&&j.selection.createRange().item){k=j.selection.createRange().item(0);i=j.createRange();i.setStartBefore(k);i.setEndAfter(k)}if(!i){i=j.createRange?j.createRange():j.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;try{h.removeAllRanges()}catch(f){}h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var h=this,g=h.getRng(),i=h.getSel(),l,k=g.startContainer,f=g.endContainer;if(!g){return h.dom.getRoot()}if(g.setStart){l=g.commonAncestorContainer;if(!g.collapsed){if(g.startContainer==g.endContainer){if(g.endOffset-g.startOffset<2){if(g.startContainer.hasChildNodes()){l=g.startContainer.childNodes[g.startOffset]}}}if(k.nodeType===3&&f.nodeType===3){function j(p,m){var o=p;while(p&&p.nodeType===3&&p.length===0){p=m?p.nextSibling:p.previousSibling}return p||o}if(k.length===g.startOffset){k=j(k.nextSibling,true)}else{k=k.parentNode}if(g.endOffset===0){f=j(f.previousSibling,false)}else{f=f.parentNode}if(k&&k===f){return k}}}if(l&&l.nodeType==3){return l.parentNode}return l}return g.item?g.item(0):g.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(!g){c.removeUnload(f.destroy)}},_fixIESelection:function(){var g=this.dom,m=g.doc,h=m.body,j,n,f;m.documentElement.unselectable=true;function i(o,r){var p=h.createTextRange();try{p.moveToPoint(o,r)}catch(q){p=null}return p}function l(p){var o;if(p.button){o=i(p.x,p.y);if(o){if(o.compareEndPoints("StartToStart",n)>0){o.setEndPoint("StartToStart",n)}else{o.setEndPoint("EndToEnd",n)}o.select()}}else{k()}}function k(){var o=m.selection.createRange();if(n&&!o.item&&o.compareEndPoints("StartToEnd",o)===0){n.select()}g.unbind(m,"mouseup",k);g.unbind(m,"mousemove",l);n=j=0}g.bind(m,["mousedown","contextmenu"],function(o){if(o.target.nodeName==="HTML"){if(j){k()}f=m.documentElement;if(f.scrollHeight>f.clientHeight){return}j=1;n=i(o.x,o.y);if(n){g.bind(m,"mouseup",k);g.bind(m,"mousemove",l);g.win.focus();n.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}e.remove_trailing_brs=true;i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// "}}else{if(o.length>0){n.firstChild.value=""}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(m.getInner?o.innerHTML:a.trim(i.getOuterHTML(o),m),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","previousSibling",e))}};(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(b){var a=b.dom.Event,c=b.each;b.create("tinymce.ui.KeyboardNavigation",{KeyboardNavigation:function(e,f){var p=this,m=e.root,l=e.items,n=e.enableUpDown,i=e.enableLeftRight||!e.enableUpDown,k=e.excludeFromTabOrder,j,h,o,d,g;f=f||b.DOM;j=function(q){g=q.target.id};h=function(q){f.setAttrib(q.target.id,"tabindex","-1")};d=function(q){var r=f.get(g);f.setAttrib(r,"tabindex","0");r.focus()};p.focus=function(){f.get(g).focus()};p.destroy=function(){c(l,function(q){f.unbind(f.get(q.id),"focus",j);f.unbind(f.get(q.id),"blur",h)});f.unbind(f.get(m),"focus",d);f.unbind(f.get(m),"keydown",o);l=f=m=p.focus=j=h=o=d=null;p.destroy=function(){}};p.moveFocus=function(u,r){var q=-1,t=p.controls,s;if(!g){return}c(l,function(x,v){if(x.id===g){q=v;return false}});q+=u;if(q<0){q=l.length-1}else{if(q>=l.length){q=0}}s=l[q];f.setAttrib(g,"tabindex","-1");f.setAttrib(s.id,"tabindex","0");f.get(s.id).focus();if(e.actOnFocus){e.onAction(s.id)}if(r){a.cancel(r)}};o=function(y){var u=37,t=39,x=38,z=40,q=27,s=14,r=13,v=32;switch(y.keyCode){case u:if(i){p.moveFocus(-1)}break;case t:if(i){p.moveFocus(1)}break;case x:if(n){p.moveFocus(-1)}break;case z:if(n){p.moveFocus(1)}break;case q:if(e.onCancel){e.onCancel();a.cancel(y)}break;case s:case r:case v:if(e.onAction){e.onAction(g);a.cancel(y)}break}};c(l,function(s,q){var r;if(!s.id){s.id=f.uniqueId("_mce_item_")}if(k){f.bind(s.id,"blur",h);r="-1"}else{r=(q===0?"0":"-1")}f.setAttrib(s.id,"tabindex",r);f.bind(f.get(s.id),"focus",j)});if(l[0]){g=l[0].id}f.setAttrib(m,"tabindex","-1");f.bind(f.get(m),"focus",d);f.bind(f.get(m),"keydown",o)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeightv){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.select("#menu_"+g.id)[0];h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+=''+a.encode(e.title)+''+c}else{d+=''+(c?''+c+"":"")}d+='";d+="";return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(i,h,f){var g=this;g.parent(i,h,f);g.items=[];g.onChange=new a(g);g.onPostRender=new a(g);g.onAdd=new a(g);g.onRenderMenu=new d.util.Dispatcher(this);g.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle");c.setAttrib(g.id,"aria-valuenow",i.title)}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null;c.setAttrib(g.id,"aria-valuenow",g.settings.title)}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='';i+="";i+="";i+="";return i},showMenu:function(){var g=this,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(j){if(j.value===g.selectedValue){f.items[j.id].setSelected(1);g.oldID=j.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){c.removeClass(f.id,f.classPrefix+"Selected");if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(function(){g.hideMenu();g.focus()});f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id,"keydown",function(h){if(h.keyCode==32){f.showMenu(h);b.cancel(h)}});b.add(f.id,"focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id,"keydown",function(h){if(h.keyCode==40){f.showMenu();b.cancel(h)}});f.keyPressHandler=b.add(f.id,"keypress",function(i){var h;if(i.keyCode==13){h=f.selectedValue;f.selectedValue=null;b.cancel(i);f.settings.onselect(h)}})}f._focused=1});b.add(f.id,"blur",function(){b.remove(f.id,"keydown",f.keyDownHandler);b.remove(f.id,"keypress",f.keyPressHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f;this.setAriaProperty("disabled",f)},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox","aria-labelledby":f.id+"_aria"},g);g+=c.createHTML("span",{id:f.id+"_aria",style:"display: none"},f.settings.title);return g},postRender:function(){var g=this,h,i=true;g.rendered=true;function f(k){var j=g.items[k.target.selectedIndex-1];if(j&&(j=j.value)){g.onChange.dispatch(g,j);if(g.settings.onselect){g.settings.onselect(j)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(k){var j;b.remove(g.id,"change",h);i=false;j=b.add(g.id,"blur",function(){if(i){return}i=true;b.add(g.id,"change",f);b.remove(g.id,"blur",j)});if(k.keyCode==13||k.keyCode==32){f(k);return b.cancel(k)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+=""+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'');i+=""+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";i+="";i=b.createHTML("table",{id:f.id,role:"presentation",tabindex:"0","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("span",{role:"button","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(i){i=i.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");g=c.add(g,"a",{role:"option",href:"javascript:;",style:{backgroundColor:"#"+i},title:p.editor.getLang("colors."+i,i),"data-mce-color":"#"+i});if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+i;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return a.cancel(i)});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('
    ');i.push("");i.push('");j(e,function(h){i.push(h.renderHTML())});i.push("");i.push("
    ");return i.join("")},focus:function(){this.keyNav.focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,""))}}if(c.stdMode){f+=''+k.renderHTML()+""}else{f+=""+k.renderHTML()+""}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,""))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,""));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},""+f+"")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",validate:true,entity_encoding:"named",url_converter:p.convertURL,url_converter_scope:p,ie7_compat:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.contentCSS=[];p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice&&!m.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language&&v.language_load!==false){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(z){var y={prefix:"plugins/",resource:z,suffix:"/editor_plugin"+m.suffix+".js"};var z=c.createUrl(y,z);c.load(z.resource,z)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+m.suffix+".js"})}}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,H=this,I=H.settings,E,A,D=H.getElement(),q,p,F,y,C,G,z,v=[];m.add(H);I.aria_label=I.aria_label||n.getAttrib(D,"aria-label",H.getLang("aria.rich_text_area"));if(I.theme){I.theme=I.theme.replace(/-/,"");q=h.get(I.theme);H.theme=new q();if(H.theme.init&&I.init_theme){H.theme.init(H,h.urls[I.theme]||m.documentBaseURL.replace(/\/$/,""))}}function B(J){var K=c.get(J),t=c.urls[J]||m.documentBaseURL.replace(/\/$/,""),s;if(K&&m.inArray(v,J)===-1){i(c.dependencies(J),function(u){B(u)});s=new K(H,t);H.plugins[J]=s;if(s.init){s.init(H,t);v.push(J)}}}i(g(I.plugins.replace(/\-/g,"")),B);if(I.popup_css!==false){if(I.popup_css){I.popup_css=H.documentBaseURI.toAbsolute(I.popup_css)}else{I.popup_css=H.baseURI.toAbsolute("themes/"+I.theme+"/skins/"+I.skin+"/dialog.css")}}if(I.popup_css_add){I.popup_css+=","+H.documentBaseURI.toAbsolute(I.popup_css_add)}H.controlManager=new m.ControlManager(H);if(I.custom_undo_redo){H.onBeforeExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.beforeChange()}});H.onExecCommand.add(function(t,J,u,K,s){if(J!="Undo"&&J!="Redo"&&J!="mceRepaint"&&(!s||!s.skip_undo)){H.undoManager.add()}})}H.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){H.nodeChanged()}});if(a){function x(s,t){if(!t||!t.initial){H.execCommand("mceRepaint")}}H.onUndo.add(x);H.onRedo.add(x);H.onSetContent.add(x)}H.onBeforeRenderUI.dispatch(H,H.controlManager);if(I.render_ui){E=I.width||D.style.width||D.offsetWidth;A=I.height||D.style.height||D.offsetHeight;H.orgDisplay=D.style.display;G=/^[0-9\.]+(|px)$/i;if(G.test(""+E)){E=Math.max(parseInt(E)+(q.deltaWidth||0),100)}if(G.test(""+A)){A=Math.max(parseInt(A)+(q.deltaHeight||0),100)}q=H.theme.renderUI({targetNode:D,width:E,height:A,deltaWidth:I.delta_width,deltaHeight:I.delta_height});H.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:E,height:A});if(I.content_css){m.each(g(I.content_css),function(s){H.contentCSS.push(H.documentBaseURI.toAbsolute(s))})}A=(q.iframeHeight||A)+(typeof(A)=="number"?(q.deltaHeight||0):"");if(A<100){A=100}H.iframeHTML=I.doctype+'';if(I.document_base_url!=m.documentBaseURL){H.iframeHTML+=''}if(I.ie7_compat){H.iframeHTML+=''}else{H.iframeHTML+=''}H.iframeHTML+='';if(!a||!/Firefox\/2/.test(navigator.userAgent)){for(z=0;z'}H.contentCSS=[]}y=I.body_id||"tinymce";if(y.indexOf("=")!=-1){y=H.getParam("body_id","","hash");y=y[H.id]||y}C=I.body_class||"";if(C.indexOf("=")!=-1){C=H.getParam("body_class","","hash");C=C[H.id]||""}H.iframeHTML+='';if(m.relaxedDomain&&(b||(m.isOpera&&parseFloat(opera.version())<11))){F='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+H.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}r=n.add(q.iframeContainer,"iframe",{id:H.id+"_ifr",src:F||'javascript:""',frameBorder:"0",allowTransparency:"true",title:I.aria_label,style:{width:"100%",height:A}});H.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=H.orgDisplay;n.get(H.id).style.display="none";n.setAttrib(H.id,"aria-hidden",true);if(!m.relaxedDomain||!F){H.setupIframe()}D=r=q=null},setupIframe:function(x){var q=this,v=q.settings,y=n.get(q.id),z=q.getDoc(),u,p;if((!b||!m.relaxedDomain)&&!x){if(a&&!v.readonly){q.getWin().onload=function(){window.setTimeout(function(){var s=q.getBody(),t;s.innerHTML="
    ";if(s.contentEditable!==t){s.contentEditable=false;s.contentEditable=true;q.onMouseDown.add(function(A,B){if(B.target.nodeName==="HTML"){z.designMode="on";window.setTimeout(function(){z.designMode="off";q.getBody().focus()},1)}})}else{z.designMode="on"}q.setupIframe(true)},1)}}z.open();z.write(q.iframeHTML);z.close();if(m.relaxedDomain){z.domain=m.relaxedDomain}if(a&&!v.readonly){return}}p=q.getBody();p.disabled=true;if(!a&&!v.readonly){p.contentEditable=true}p.disabled=false;q.schema=new m.html.Schema(v);q.dom=new m.dom.DOMUtils(q.getDoc(),{keep_values:true,url_converter:q.convertURL,url_converter_scope:q,hex_colors:v.force_hex_style_colors,class_filter:v.class_filter,update_styles:1,fix_ie_paragraphs:1,schema:q.schema});q.parser=new m.html.DomParser(v,q.schema);if(!q.settings.allow_html_in_named_anchor){q.parser.addAttributeFilter("name",function(s,t){var B=s.length,D,A,C,E;while(B--){E=s[B];if(E.name==="a"&&E.firstChild){C=E.parent;D=E.lastChild;do{A=D.prev;C.insert(D,E);D=A}while(D)}}})}q.parser.addAttributeFilter("src,href,style",function(s,t){var A=s.length,C,E=q.dom,D,B;while(A--){C=s[A];D=C.attr(t);B="data-mce-"+t;if(!C.attributes.map[B]){if(t==="style"){C.attr(B,E.serializeStyle(E.parseStyle(D),C.name))}else{C.attr(B,q.convertURL(D,t,C.name))}}}});q.parser.addNodeFilter("script",function(s,t){var A=s.length;while(A--){s[A].attr("type","mce-text/javascript")}});q.parser.addNodeFilter("#cdata",function(s,t){var A=s.length,B;while(A--){B=s[A];B.type=8;B.name="#comment";B.value="[CDATA["+B.value+"]]"}});q.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,A){var B=t.length,C,s=q.schema.getNonEmptyElements();while(B--){C=t[B];if(C.isEmpty(s)){C.empty().append(new m.html.Node("br",1)).shortEnded=true}}});q.serializer=new m.dom.Serializer(v,q.dom,q.schema);q.selection=new m.dom.Selection(q.dom,q.getWin(),q.serializer);q.formatter=new m.Formatter(this);q.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",collapsed:false,styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",collapsed:false,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:false,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",collapsed:false,styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},wrap_links:false},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},wrap_links:false},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){q.formatter.register(s,{block:s,remove:"all"})});q.formatter.register(q.settings.formats);q.undoManager=new m.UndoManager(q);q.undoManager.onAdd.add(function(t,s){if(t.hasUndo()){return q.onChange.dispatch(q,s,t)}});q.undoManager.onUndo.add(function(t,s){return q.onUndo.dispatch(q,s,t)});q.undoManager.onRedo.add(function(t,s){return q.onRedo.dispatch(q,s,t)});q.forceBlocks=new m.ForceBlocks(q,{forced_root_block:v.forced_root_block});q.editorCommands=new m.EditorCommands(q);q.serializer.onPreProcess.add(function(s,t){return q.onPreProcess.dispatch(q,t,s)});q.serializer.onPostProcess.add(function(s,t){return q.onPostProcess.dispatch(q,t,s)});q.onPreInit.dispatch(q);if(!v.gecko_spellcheck){q.getBody().spellcheck=0}if(!v.readonly){q._addEvents()}q.controlManager.onPostRender.dispatch(q,q.controlManager);q.onPostRender.dispatch(q);if(v.directionality){q.getBody().dir=v.directionality}if(v.nowrap){q.getBody().style.whiteSpace="nowrap"}if(v.handle_node_change_callback){q.onNodeChange.add(function(t,s,A){q.execCallback("handle_node_change_callback",q.id,A,-1,-1,true,q.selection.isCollapsed())})}if(v.save_callback){q.onSaveContent.add(function(s,A){var t=q.execCallback("save_callback",q.id,A.content,q.getBody());if(t){A.content=t}})}if(v.onchange_callback){q.onChange.add(function(t,s){q.execCallback("onchange_callback",q,s)})}if(v.protect){q.onBeforeSetContent.add(function(s,t){if(v.protect){i(v.protect,function(A){t.content=t.content.replace(A,function(B){return""})})}})}if(v.convert_newlines_to_brs){q.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"
    ")}})}if(v.preformatted){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='
    '+t.content+"
    "}})}if(v.verify_css_classes){q.serializer.attribValueFilter=function(C,A){var B,t;if(C=="class"){if(!q.classesRE){t=q.dom.getClasses();if(t.length>0){B="";i(t,function(s){B+=(B?"|":"")+s["class"]});q.classesRE=new RegExp("("+B+")","gi")}}return !q.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(A)||q.classesRE.test(A)?A:""}return A}}if(v.cleanup_callback){q.onBeforeSetContent.add(function(s,t){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)});q.onPreProcess.add(function(s,t){if(t.set){q.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){q.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});q.onPostProcess.add(function(s,t){if(t.set){t.content=q.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=q.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(v.save_callback){q.onGetContent.add(function(s,t){if(t.save){t.content=q.execCallback("save_callback",q.id,t.content,q.getBody())}})}if(v.handle_event_callback){q.onEvent.add(function(s,t,A){if(q.execCallback("handle_event_callback",t,s,A)===false){j.cancel(t)}})}q.onSetContent.add(function(){q.addVisual(q.getBody())});if(v.padd_empty_editor){q.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
    [\r\n]*)$/,"")})}if(a){function r(s,t){i(s.dom.select("a"),function(B){var A=B.parentNode;if(s.dom.isBlock(A)&&A.lastChild===B){s.dom.add(A,"br",{"data-mce-bogus":1})}})}q.onExecCommand.add(function(s,t){if(t==="CreateLink"){r(s)}});q.onSetContent.add(q.selection.onSetContent.add(r))}q.load({initial:true,format:"html"});q.startContent=q.getContent({format:"raw"});q.undoManager.add();q.initialized=true;q.onInit.dispatch(q);q.execCallback("setupcontent_callback",q.id,q.getBody(),q.getDoc());q.execCallback("init_instance_callback",q);q.focus(true);q.nodeChanged({initial:1});i(q.contentCSS,function(s){q.dom.loadCSS(s)});if(v.auto_focus){setTimeout(function(){var s=m.get(v.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getBody().focus();s.getWin().focus()},100)}y=null},focus:function(s){var x,q=this,v=q.settings.content_editable,r,p,u=q.getDoc();if(!s){r=q.selection.getRng();if(r.item){p=r.item(0)}if(!v){q.getWin().focus()}if(p&&p.ownerDocument==u){r=u.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((x=m.activeEditor)!=null){x.onDeactivate.dispatch(x,q)}q.onActivate.dispatch(q,x)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=q.getStart()||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(p,r,q){this.execCommands[p]={func:r,scope:q||this}},addQueryStateHandler:function(p,r,q){this.queryStateCommands[p]={func:r,scope:q||this}},addQueryValueHandler:function(p,r,q){this.queryValueCommands[p]={func:r,scope:q||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=false;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(u,s){var r=this,q,p=r.getBody(),t;s=s||{};s.format=s.format||"html";s.set=true;s.content=u;if(!s.no_events){r.onBeforeSetContent.dispatch(r,s)}u=s.content;if(!m.isIE&&(u.length===0||/^\s+$/.test(u))){t=r.settings.forced_root_block;if(t){u="<"+t+'>
    "}else{u='
    '}p.innerHTML=u;r.selection.select(p,true);r.selection.collapse(true);return}if(s.format!=="raw"){u=new m.html.Serializer({},r.schema).serialize(r.parser.parse(u))}s.content=m.trim(u);r.dom.setHTML(p,s.content);if(!s.no_events){r.onSetContent.dispatch(r,s)}return s.content},getContent:function(q){var p=this,r;q=q||{};q.format=q.format||"html";q.get=true;if(!q.no_events){p.onBeforeGetContent.dispatch(p,q)}if(q.format=="raw"){r=p.getBody().innerHTML}else{r=p.serializer.serialize(p.getBody(),q)}q.content=m.trim(r);if(!q.no_events){p.onGetContent.dispatch(p,q)}return q.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var B=this,r,C=B.settings,q=B.dom,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function p(t,D){var s=t.type;if(B.removed){return}if(B.onEvent.dispatch(B,t,D)!==false){B[x[t.fakeType||t.type]].dispatch(B,t,D)}}i(x,function(t,s){switch(s){case"contextmenu":q.bind(B.getDoc(),s,p);break;case"paste":q.bind(B.getBody(),s,function(D){p(D)});break;case"submit":case"reset":q.bind(B.getElement().form||n.getParent(B.id,"form"),s,p);break;default:q.bind(C.content_editable?B.getBody():B.getDoc(),s,p)}});q.bind(C.content_editable?B.getBody():(a?B.getDoc():B.getWin()),"focus",function(s){B.focus(true)});if(m.isGecko){q.bind(B.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("data-mce-src"))){t.src=B.documentBaseURI.toAbsolute(s)}})}if(a){function u(){var E=this,G=E.getDoc(),F=E.settings;if(a&&!F.readonly){if(E._isHidden()){try{if(!F.content_editable){G.body.contentEditable=false;G.body.contentEditable=true}}catch(D){}}try{G.execCommand("styleWithCSS",0,false)}catch(D){if(!E._isHidden()){try{G.execCommand("useCSS",0,true)}catch(D){}}}if(!F.table_inline_editing){try{G.execCommand("enableInlineTableEditing",false,false)}catch(D){}}if(!F.object_resizing){try{G.execCommand("enableObjectResizing",false,false)}catch(D){}}}}B.onBeforeExecCommand.add(u);B.onMouseDown.add(u)}B.onClick.add(function(s,t){t=t.target;if(m.isWebKit&&t.nodeName=="IMG"){B.selection.getSel().setBaseAndExtent(t,0,t,1)}if(t.nodeName=="A"&&q.hasClass(t,"mceItemAnchor")){B.selection.select(t)}B.nodeChanged()});B.onMouseUp.add(B.nodeChanged);B.onKeyUp.add(function(s,t){var D=t.keyCode;if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45||D==46||D==8||(m.isMac&&(D==91||D==93))||t.ctrlKey){B.nodeChanged()}});B.onReset.add(function(){B.setContent(B.startContent,{format:"raw"})});if(C.custom_shortcuts){if(C.custom_undo_redo_keyboard_shortcuts){B.addShortcut("ctrl+z",B.getLang("undo_desc"),"Undo");B.addShortcut("ctrl+y",B.getLang("redo_desc"),"Redo")}B.addShortcut("ctrl+b",B.getLang("bold_desc"),"Bold");B.addShortcut("ctrl+i",B.getLang("italic_desc"),"Italic");B.addShortcut("ctrl+u",B.getLang("underline_desc"),"Underline");for(r=1;r<=6;r++){B.addShortcut("ctrl+"+r,"",["FormatBlock",false,"h"+r])}B.addShortcut("ctrl+7","",["FormatBlock",false,"

    "]);B.addShortcut("ctrl+8","",["FormatBlock",false,"

    "]);B.addShortcut("ctrl+9","",["FormatBlock",false,"
    "]);function v(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(B.shortcuts,function(D){if(m.isMac&&D.ctrl!=t.metaKey){return}else{if(!m.isMac&&D.ctrl!=t.ctrlKey){return}}if(D.alt!=t.altKey){return}if(D.shift!=t.shiftKey){return}if(t.keyCode==D.keyCode||(t.charCode&&t.charCode==D.charCode)){s=D;return false}});return s}B.onKeyUp.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyPress.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyDown.add(function(s,t){var D=v(t);if(D){D.func.call(D.scope);return j.cancel(t)}})}if(m.isIE){q.bind(B.getDoc(),"controlselect",function(D){var t=B.resizeInfo,s;D=D.target;if(D.nodeName!=="IMG"){return}if(t){q.unbind(t.node,t.ev,t.cb)}if(!q.hasClass(D,"mceItemNoResize")){ev="resizeend";s=q.bind(D,ev,function(F){var E;F=F.target;if(E=q.getStyle(F,"width")){q.setAttrib(F,"width",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"width","")}if(E=q.getStyle(F,"height")){q.setAttrib(F,"height",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"height","")}})}else{ev="resizestart";s=q.bind(D,"resizestart",j.cancel,j)}t=B.resizeInfo={node:D,ev:ev,cb:s}})}if(m.isOpera){B.onClick.add(function(s,t){j.prevent(t)})}if(C.custom_undo_redo){function y(){B.undoManager.typing=false;B.undoManager.add()}q.bind(B.getDoc(),"focusout",function(s){if(!B.removed&&B.undoManager.typing){y()}});B.dom.bind(B.dom.getRoot(),"dragend",function(s){y()});B.onKeyUp.add(function(s,D){var t=D.keyCode;if((t>=33&&t<=36)||(t>=37&&t<=40)||t==13||t==45||D.ctrlKey){y()}});B.onKeyDown.add(function(s,E){var D=E.keyCode,t;if(D==8){t=B.getDoc().selection;if(t&&t.createRange&&t.createRange().item){B.undoManager.beforeChange();s.dom.remove(t.createRange().item(0));y();return j.cancel(E)}}if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45){if(m.isIE&&D==13){B.undoManager.beforeChange()}if(B.undoManager.typing){y()}return}if((D<16||D>20)&&D!=224&&D!=91&&!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.typing=true;B.undoManager.add()}});B.onMouseDown.add(function(){if(B.undoManager.typing){y()}})}if(m.isGecko){function A(){var s=B.dom.getAttribs(B.selection.getStart().cloneNode(false));return function(){var t=B.selection.getStart();B.dom.removeAllAttribs(t);i(s,function(D){t.setAttributeNode(D.cloneNode(true))})}}function z(){var t=B.selection;return !t.isCollapsed()&&t.getStart()!=t.getEnd()}B.onKeyPress.add(function(s,D){var t;if((D.keyCode==8||D.keyCode==46)&&z()){t=A();B.getDoc().execCommand("delete",false,null);t();return j.cancel(D)}});B.dom.bind(B.getDoc(),"cut",function(t){var s;if(z()){s=A();B.onKeyUp.addToTop(j.cancel,j);setTimeout(function(){s();B.onKeyUp.remove(j.cancel,j)},0)}})}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var l=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,o;function q(y,x,v){var u;y=y.toLowerCase();if(u=j.exec[y]){u(y,x,v);return a}return b}function m(v){var u;v=v.toLowerCase();if(u=j.state[v]){return u(v)}return -1}function h(v){var u;v=v.toLowerCase();if(u=j.value[v]){return u(v)}return b}function t(u,v){v=v||"exec";d(u,function(y,x){d(x.toLowerCase().split(","),function(z){j[v][z]=y})})}c.extend(this,{execCommand:q,queryCommandState:m,queryCommandValue:h,addCommands:t});function f(x,v,u){if(v===e){v=b}if(u===e){u=null}return n.getDoc().execCommand(x,v,u)}function s(u){return n.formatter.match(u)}function r(u,v){n.formatter.toggle(u,v?{value:v}:e)}function i(u){o=p.getBookmark(u)}function g(){p.moveToBookmark(o)}t({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(y){var x=n.getDoc(),u;try{f(y)}catch(v){u=a}if(u||!x.queryCommandSupported(y)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(z){if(z){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(u){if(p.isCollapsed()){p.select(p.getNode())}f(u);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){var v=u.substring(7);d("left,center,right,full".split(","),function(x){if(v!=x){n.formatter.remove("align"+x)}});r("align"+v);q("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(x){var u,v;f(x);u=l.getParent(p.getNode(),"ol,ul");if(u){v=u.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)){i();l.split(v,u);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){r(u)},"ForeColor,HiliteColor,FontName":function(x,v,u){r(x,u)},FontSize:function(y,x,v){var u,z;if(v>=1&&v<=7){z=c.explode(k.font_size_style_values);u=c.explode(k.font_size_classes);if(u){v=u[v-1]||v}else{v=z[v-1]||v}}r(y,v)},RemoveFormat:function(u){n.formatter.remove(u)},mceBlockQuote:function(u){r("blockquote")},FormatBlock:function(x,v,u){return r(u||"p")},mceCleanup:function(){var u=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(u)},mceRemoveNode:function(y,x,v){var u=v||p.getNode();if(u!=n.getBody()){i();n.dom.remove(u,a);g()}},mceSelectNodeDepth:function(y,x,v){var u=0;l.getParent(p.getNode(),function(z){if(z.nodeType==1&&u++==v){p.select(z);return b}},n.getBody())},mceSelectNode:function(x,v,u){p.select(u)},mceInsertContent:function(A,H,J){var x,I,D,y,E,F,C,B,K,v,z,L,u,G;x=n.parser;I=new c.html.Serializer({},n.schema);u='\uFEFF';F={content:J,format:"html"};p.onBeforeSetContent.dispatch(p,F);J=F.content;if(J.indexOf("{$caret}")==-1){J+="{$caret}"}J=J.replace(/\{\$caret\}/,u);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}D=p.getNode();F={context:D.nodeName.toLowerCase()};E=x.parse(J,F);z=E.lastChild;if(z.attr("id")=="mce_marker"){C=z;for(z=z.prev;z;z=z.walk(true)){if(z.type==3||!l.isBlock(z.name)){z.parent.insert(C,z,z.name==="br");break}}}if(!F.invalid){J=I.serialize(E);z=D.firstChild;L=D.lastChild;if(!z||(z===L&&z.nodeName==="BR")){l.setHTML(D,J)}else{p.setContent(J)}}else{p.setContent(u);D=n.selection.getNode();y=n.getBody();if(D.nodeType==9){D=z=y}else{z=D}while(z!==y){D=z;z=z.parentNode}J=D==y?y.innerHTML:l.getOuterHTML(D);J=I.serialize(x.parse(J.replace(//i,function(){return I.serialize(E)})));if(D==y){l.setHTML(y,J)}else{l.setOuterHTML(D,J)}}C=l.get("mce_marker");B=l.getRect(C);K=l.getViewPort(n.getWin());if((B.y+B.h>K.y+K.h||B.yK.x+K.w||B.x")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(x,v,u){n.execCommand("mceInsertContent",false,u.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(B,A,z){var y=l.getParent(p.getNode(),"a"),v,x,u;if(c.is(z,"string")){z={href:z}}z.href=z.href.replace(" ","%20");if(!y){if(c.isWebKit){v=l.getParent(p.getNode(),"img");if(v){x=v.style.cssText;u=v.className;v.style.cssText=null;v.className=null}}f("CreateLink",b,"javascript:mctmp(0);");if(x){v.style.cssText=x}if(u){v.className=u}d(l.select("a[href='javascript:mctmp(0);']"),function(C){l.setAttribs(C,z)})}else{if(z.href){l.setAttribs(y,z)}else{n.dom.remove(y,a)}}},selectAll:function(){var v=l.getRoot(),u=l.createRng();u.setStart(v,0);u.setEnd(v,v.childNodes.length);n.selection.setRng(u)}});t({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){return s("align"+u.substring(7))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){return s(u)},mceBlockQuote:function(){return s("blockquote")},Outdent:function(){var u;if(k.inline_styles){if((u=l.getParent(p.getStart(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}if((u=l.getParent(p.getEnd(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}}return m("InsertUnorderedList")||m("InsertOrderedList")||(!k.inline_styles&&!!l.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(u){return l.getParent(p.getNode(),u=="insertunorderedlist"?"UL":"OL")}},"state");t({"FontSize,FontName":function(x){var v=0,u;if(u=l.getParent(p.getNode(),"span")){if(x=="fontsize"){v=u.style.fontSize}else{v=u.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return v}},"value");if(k.custom_undo_redo){t({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(f){var d,e=0,h=[],c;function g(){return b.trim(f.getContent({format:"raw",no_events:1}))}return d={typing:false,onAdd:new a(d),onUndo:new a(d),onRedo:new a(d),beforeChange:function(){c=f.selection.getBookmark(2,true)},add:function(m){var j,k=f.settings,l;m=m||{};m.content=g();l=h[e];if(l&&l.content==m.content){return null}if(h[e]){h[e].beforeBookmark=c}if(k.custom_undo_redo_levels){if(h.length>k.custom_undo_redo_levels){for(j=0;j0){k=h[--e];f.setContent(k.content,{format:"raw"});f.selection.moveToBookmark(k.beforeBookmark);d.onUndo.dispatch(d,k)}return k},redo:function(){var i;if(e0||this.typing},hasRedo:function(){return e');q.replace(p,m);o.select(p,1)}return g}return d}l.create("tinymce.ForceBlocks",{ForceBlocks:function(m){var n=this,o=m.settings,p;n.editor=m;n.dom=m.dom;p=(o.forced_root_block||"p").toLowerCase();o.element=p.toUpperCase();m.onPreInit.add(n.setup,n)},setup:function(){var n=this,m=n.editor,p=m.settings,u=m.dom,o=m.selection,q=m.schema.getBlockElements();if(p.forced_root_block){function v(){var y=o.getStart(),t=m.getBody(),s,z,D,F,E,x,A,B=-16777215;if(!y||y.nodeType!==1){return}while(y!=t){if(q[y.nodeName]){return}y=y.parentNode}s=o.getRng();if(s.setStart){z=s.startContainer;D=s.startOffset;F=s.endContainer;E=s.endOffset}else{if(s.item){s=m.getDoc().body.createTextRange();s.moveToElementText(s.item(0))}tmpRng=s.duplicate();tmpRng.collapse(true);D=tmpRng.move("character",B)*-1;if(!tmpRng.collapsed){tmpRng=s.duplicate();tmpRng.collapse(false);E=(tmpRng.move("character",B)*-1)-D}}for(y=t.firstChild;y;y){if(y.nodeType===3||(y.nodeType==1&&!q[y.nodeName])){if(!x){x=u.create(p.forced_root_block);y.parentNode.insertBefore(x,y)}A=y;y=y.nextSibling;x.appendChild(A)}else{x=null;y=y.nextSibling}}if(s.setStart){s.setStart(z,D);s.setEnd(F,E);o.setRng(s)}else{try{s=m.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(true);s.moveStart("character",D);if(E>0){s.moveEnd("character",E)}s.select()}catch(C){}}m.nodeChanged()}m.onKeyUp.add(v);m.onClick.add(v)}if(p.force_br_newlines){if(c){m.onKeyPress.add(function(s,t){var x;if(t.keyCode==13&&o.getNode().nodeName!="LI"){o.setContent('
    ',{format:"raw"});x=u.get("__");x.removeAttribute("id");o.select(x);o.collapse();return j.cancel(t)}})}}if(p.force_p_newlines){if(!c){m.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!n.insertPara(t)){j.cancel(t)}})}else{l.addUnload(function(){n._previousFormats=0});m.onKeyPress.add(function(s,t){n._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&p.keep_styles){n._previousFormats=k(s.selection.getStart())}});m.onKeyUp.add(function(t,y){if(y.keyCode==13&&!y.shiftKey){var x=t.selection.getStart(),s=n._previousFormats;if(!x.hasChildNodes()&&s){x=u.getParent(x,u.isBlock);if(x&&x.nodeName!="LI"){x.innerHTML="";if(n._previousFormats){x.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{x.innerHTML="\uFEFF"}o.select(x,1);o.collapse(true);t.getDoc().execCommand("Delete",false,null);n._previousFormats=0}}}})}if(a){m.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){n.backspaceDelete(t,t.keyCode==8)}})}}if(l.isWebKit){function r(t){var s=o.getRng(),x,A=u.create("div",null," "),z,y=u.getViewPort(t.getWin()).h;s.insertNode(x=u.create("br"));s.setStartAfter(x);s.setEndAfter(x);o.setRng(s);if(o.getSel().focusNode==x.previousSibling){o.select(u.insertAfter(u.doc.createTextNode("\u00a0"),x));o.collapse(d)}u.insertAfter(A,x);z=u.getPos(A).y;u.remove(A);if(z>y){t.getWin().scrollTo(0,z)}}m.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(p.force_br_newlines&&!u.getParent(o.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);j.cancel(t)}})}if(c){if(p.element!="P"){m.onKeyPress.add(function(s,t){n.lastElm=o.getNode().nodeName});m.onKeyUp.add(function(t,x){var z,y=o.getNode(),s=t.getBody();if(s.childNodes.length===1&&y.nodeName=="P"){y=u.rename(y,p.element);o.select(y);o.collapse();t.nodeChanged()}else{if(x.keyCode==13&&!x.shiftKey&&n.lastElm!="P"){z=u.getParent(y,"p");if(z){u.rename(z,p.element);t.nodeChanged()}}}})}}},getParentBlock:function(o){var m=this.dom;return m.getParent(o,m.isBlock)},insertPara:function(Q){var E=this,v=E.editor,M=v.dom,R=v.getDoc(),V=v.settings,F=v.selection.getSel(),G=F.getRangeAt(0),U=R.body;var J,K,H,O,N,q,o,u,z,m,C,T,p,x,I,L=M.getViewPort(v.getWin()),B,D,A;v.undoManager.beforeChange();J=R.createRange();J.setStart(F.anchorNode,F.anchorOffset);J.collapse(d);K=R.createRange();K.setStart(F.focusNode,F.focusOffset);K.collapse(d);H=J.compareBoundaryPoints(J.START_TO_END,K)<0;O=H?F.anchorNode:F.focusNode;N=H?F.anchorOffset:F.focusOffset;q=H?F.focusNode:F.anchorNode;o=H?F.focusOffset:F.anchorOffset;if(O===q&&/^(TD|TH)$/.test(O.nodeName)){if(O.firstChild.nodeName=="BR"){M.remove(O.firstChild)}if(O.childNodes.length==0){v.dom.add(O,V.element,null,"
    ");T=v.dom.add(O,V.element,null,"
    ")}else{I=O.innerHTML;O.innerHTML="";v.dom.add(O,V.element,null,I);T=v.dom.add(O,V.element,null,"
    ")}G=R.createRange();G.selectNodeContents(T);G.collapse(1);v.selection.setRng(G);return g}if(O==U&&q==U&&U.firstChild&&v.dom.isBlock(U.firstChild)){O=q=O.firstChild;N=o=0;J=R.createRange();J.setStart(O,0);K=R.createRange();K.setStart(q,0)}O=O.nodeName=="HTML"?R.body:O;O=O.nodeName=="BODY"?O.firstChild:O;q=q.nodeName=="HTML"?R.body:q;q=q.nodeName=="BODY"?q.firstChild:q;u=E.getParentBlock(O);z=E.getParentBlock(q);m=u?u.nodeName:V.element;if(I=E.dom.getParent(u,"li,pre")){if(I.nodeName=="LI"){return e(v.selection,E.dom,I)}return d}if(u&&(u.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;u=null}if(z&&(z.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(M.getStyle(u,"position",1)))){m=V.element;z=null}if(/(TD|TABLE|TH|CAPTION)/.test(m)||(u&&m=="DIV"&&/left|right/gi.test(M.getStyle(u,"float",1)))){m=V.element;u=z=null}C=(u&&u.nodeName==m)?u.cloneNode(0):v.dom.create(m);T=(z&&z.nodeName==m)?z.cloneNode(0):v.dom.create(m);T.removeAttribute("id");if(/^(H[1-6])$/.test(m)&&f(G,u)){T=v.dom.create(V.element)}I=p=O;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}p=I}while((I=I.previousSibling?I.previousSibling:I.parentNode));I=x=q;do{if(I==U||I.nodeType==9||E.dom.isBlock(I)||/(TD|TABLE|TH|CAPTION)/.test(I.nodeName)){break}x=I}while((I=I.nextSibling?I.nextSibling:I.parentNode));if(p.nodeName==m){J.setStart(p,0)}else{J.setStartBefore(p)}J.setEnd(O,N);C.appendChild(J.cloneContents()||R.createTextNode(""));try{K.setEndAfter(x)}catch(P){}K.setStart(q,o);T.appendChild(K.cloneContents()||R.createTextNode(""));G=R.createRange();if(!p.previousSibling&&p.parentNode.nodeName==m){G.setStartBefore(p.parentNode)}else{if(J.startContainer.nodeName==m&&J.startOffset==0){G.setStartBefore(J.startContainer)}else{G.setStart(J.startContainer,J.startOffset)}}if(!x.nextSibling&&x.parentNode.nodeName==m){G.setEndAfter(x.parentNode)}else{G.setEnd(K.endContainer,K.endOffset)}G.deleteContents();if(b){v.getWin().scrollTo(0,L.y)}if(C.firstChild&&C.firstChild.nodeName==m){C.innerHTML=C.firstChild.innerHTML}if(T.firstChild&&T.firstChild.nodeName==m){T.innerHTML=T.firstChild.innerHTML}function S(y,s){var r=[],X,W,t;y.innerHTML="";if(V.keep_styles){W=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(W.nodeName)){X=W.cloneNode(g);M.setAttrib(X,"id","");r.push(X)}}while(W=W.parentNode)}if(r.length>0){for(t=r.length-1,X=y;t>=0;t--){X=X.appendChild(r[t])}r[0].innerHTML=b?"\u00a0":"
    ";return r[0]}else{y.innerHTML=b?"\u00a0":"
    "}}if(M.isEmpty(C)){S(C,O)}if(M.isEmpty(T)){A=S(T,q)}if(b&&parseFloat(opera.version())<9.5){G.insertNode(C);G.insertNode(T)}else{G.insertNode(T);G.insertNode(C)}T.normalize();C.normalize();v.selection.select(T,true);v.selection.collapse(true);B=v.dom.getPos(T).y;if(BL.y+L.h){v.getWin().scrollTo(0,B1||!F(ap))&&an===0){c.remove(ap,1);return}if(ag.inline||ag.wrapper){if(!ag.exact&&an===1){ap=ao(ap)}O(ab,function(ar){O(c.select(ar.inline,ap),function(au){var at;if(ar.wrap_links===false){at=au.parentNode;do{if(at.nodeName==="A"){return}}while(at=at.parentNode)}U(ar,af,au,ar.exact?au:null)})});if(x(ap.parentNode,Y,af)){c.remove(ap,1);ap=0;return B}if(ag.merge_with_parents){c.getParent(ap.parentNode,function(ar){if(x(ar,Y,af)){c.remove(ap,1);ap=0;return B}})}if(ap){ap=u(C(ap),ap);ap=u(ap,C(ap,B))}}})}if(ag){if(aa){X=c.createRng();X.setStartBefore(aa);X.setEndAfter(aa);ah(o(X,ab))}else{if(!ac||!ag.inline||c.select("td.mceSelected,th.mceSelected").length){var ai=V.selection.getNode();ae=q.getBookmark();ah(o(q.getRng(B),ab));if(ag.styles&&(ag.styles.color||ag.styles.textDecoration)){a.walk(ai,I,"childNodes");I(ai)}q.moveToBookmark(ae);q.setRng(Z(q.getRng(B)));V.nodeChanged()}else{Q("apply",Y,af)}}}}function A(Y,ah,ab){var ac=R(Y),aj=ac[0],ag,af,X;function aa(am){var al=am.startContainer,ar=am.startOffset,aq,ap,an,ao;if(al.nodeType==3&&ar>=al.nodeValue.length-1){al=al.parentNode;ar=s(al)+1}if(al.nodeType==1){an=al.childNodes;al=an[Math.min(ar,an.length-1)];aq=new t(al);if(ar>an.length-1){aq.next()}for(ap=aq.current();ap;ap=aq.next()){if(ap.nodeType==3&&!f(ap)){ao=c.create("a",null,E);ap.parentNode.insertBefore(ao,ap);am.setStart(ap,0);q.setRng(am);c.remove(ao);return}}}}function Z(ao){var an,am,al;an=a.grep(ao.childNodes);for(am=0,al=ac.length;am=0;Z--){if(P.apply[Z].name==Y){return true}}for(Z=P.remove.length-1;Z>=0;Z--){if(P.remove[Z].name==Y){return false}}return W(q.getNode())}aa=q.getNode();if(W(aa)){return B}X=q.getStart();if(X!=aa){if(W(X)){return B}}return S}function v(ad,ac){var aa,ab=[],Z={},Y,X,W;if(q.isCollapsed()){for(X=0;X=0;Y--){W=ad[X];if(P.remove[Y].name==W){Z[W]=true;break}}}for(Y=P.apply.length-1;Y>=0;Y--){for(X=0;X=0;X--){W=ac[X].selector;if(!W){return B}for(ab=Y.length-1;ab>=0;ab--){if(c.is(Y[ab],W)){return B}}}}return S}a.extend(this,{get:R,register:k,apply:T,remove:A,toggle:D,match:j,matchAll:v,matchNode:x,canApply:y});function h(W,X){if(g(W,X.inline)){return B}if(g(W,X.block)){return B}if(X.selector){return c.is(W,X.selector)}}function g(X,W){X=X||"";W=W||"";X=""+(X.nodeName||X);W=""+(W.nodeName||W);return X.toLowerCase()==W.toLowerCase()}function L(X,W){var Y=c.getStyle(X,W);if(W=="color"||W=="backgroundColor"){Y=c.toHex(Y)}if(W=="fontWeight"&&Y==700){Y="bold"}return""+Y}function r(W,X){if(typeof(W)!="string"){W=W(X)}else{if(X){W=W.replace(/%(\w+)/g,function(Z,Y){return X[Y]||Z})}}return W}function f(W){return W&&W.nodeType===3&&/^([\s\r\n]+|)$/.test(W.nodeValue)}function N(Y,X,W){var Z=c.create(X,W);Y.parentNode.insertBefore(Z,Y);Z.appendChild(Y);return Z}function o(W,ag,Z){var Y=W.startContainer,ad=W.startOffset,aj=W.endContainer,ae=W.endOffset,ai,af,ac;function ah(am,an,ak,al){var ao,ap;al=al||c.getRoot();for(;;){ao=am.parentNode;if(ao==al||(!ag[0].block_expand&&F(ao))){return am}for(ai=ao[an];ai&&ai!=am;ai=ai[ak]){if(ai.nodeType==1&&!H(ai)){return am}if(ai.nodeType==3&&!f(ai)){return am}}am=am.parentNode}return am}function ab(ak,al){if(al===p){al=ak.nodeType===3?ak.length:ak.childNodes.length}while(ak&&ak.hasChildNodes()){ak=ak.childNodes[al];if(ak){al=ak.nodeType===3?ak.length:ak.childNodes.length}}return{node:ak,offset:al}}if(Y.nodeType==1&&Y.hasChildNodes()){af=Y.childNodes.length-1;Y=Y.childNodes[ad>af?af:ad];if(Y.nodeType==3){ad=0}}if(aj.nodeType==1&&aj.hasChildNodes()){af=aj.childNodes.length-1;aj=aj.childNodes[ae>af?af:ae-1];if(aj.nodeType==3){ae=aj.nodeValue.length}}if(H(Y.parentNode)){Y=Y.parentNode}if(H(Y)){Y=Y.nextSibling||Y}if(H(aj.parentNode)){ae=c.nodeIndex(aj);aj=aj.parentNode}if(H(aj)&&aj.previousSibling){aj=aj.previousSibling;ae=aj.length}if(ag[0].inline){ac=ab(aj,ae);if(ac.node){while(ac.node&&ac.offset===0&&ac.node.previousSibling){ac=ab(ac.node.previousSibling)}if(ac.node&&ac.offset>0&&ac.node.nodeType===3&&ac.node.nodeValue.charAt(ac.offset-1)===" "){if(ac.offset>1){aj=ac.node;aj.splitText(ac.offset-1)}else{if(ac.node.previousSibling){aj=ac.node.previousSibling}}}}}if(ag[0].inline||ag[0].block_expand){Y=ah(Y,"firstChild","nextSibling");aj=ah(aj,"lastChild","previousSibling")}if(ag[0].selector&&ag[0].expand!==S&&!ag[0].inline){function aa(al,ak){var am,an,ap,ao;if(al.nodeType==3&&al.nodeValue.length==0&&al[ak]){al=al[ak]}am=m(al);for(an=0;anY?Y:Z]}return W}function Q(ab,X,aa){var Y,W=P[ab],ac=P[ab=="apply"?"remove":"apply"];function ad(){return P.apply.length||P.remove.length}function Z(){P.apply=[];P.remove=[]}function ae(af){O(P.apply.reverse(),function(ag){T(ag.name,ag.vars,af);if(ag.name==="forecolor"&&ag.vars.value){I(af.parentNode)}});O(P.remove.reverse(),function(ag){A(ag.name,ag.vars,af)});c.remove(af,1);Z()}for(Y=W.length-1;Y>=0;Y--){if(W[Y].name==X){return}}W.push({name:X,vars:aa});for(Y=ac.length-1;Y>=0;Y--){if(ac[Y].name==X){ac.splice(Y,1)}}if(ad()){V.getDoc().execCommand("FontName",false,"mceinline");P.lastRng=q.getRng();O(c.select("font,span"),function(ag){var af;if(b(ag)){af=q.getBookmark();ae(ag);q.moveToBookmark(af);V.nodeChanged()}});if(!P.isListening&&ad()){P.isListening=true;O("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(af){V[af].addToTop(function(ag,ah){if(ad()&&!a.dom.RangeUtils.compareRanges(P.lastRng,q.getRng())){O(c.select("font,span"),function(aj){var ak,ai;if(b(aj)){ak=aj.firstChild;while(ak&&ak.nodeType!=3){ak=ak.firstChild}if(ak){ae(aj);ai=c.createRng();ai.setStart(ak,ak.nodeValue.length);ai.setEnd(ak,ak.nodeValue.length);q.setRng(ai);ag.nodeChanged()}else{c.remove(aj)}}});if(ah.type=="keyup"||ah.type=="mouseup"){Z()}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}}); \ No newline at end of file diff --git a/plugins/TinyMCE/js/tiny_mce_popup.js b/plugins/TinyMCE/js/tiny_mce_popup.js deleted file mode 100644 index f859d24e6a..0000000000 --- a/plugins/TinyMCE/js/tiny_mce_popup.js +++ /dev/null @@ -1,5 +0,0 @@ - -// Uncomment and change this document.domain value if you are loading the script cross subdomains -// document.domain = 'moxiecode.com'; - -var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('