summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Lécureuil <neoclust@mageia.org>2017-04-19 00:18:12 +0200
committerNicolas Lécureuil <neoclust@mageia.org>2017-04-19 00:18:12 +0200
commit0e8b7f021f27e524f8c0b25dca600c00fd2c2468 (patch)
treea1194ff372adcc235bcfea361af8830ed954456a
parent14ffe3143e36d79ef7054b293e51f3fb4b658224 (diff)
downloadmediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar
mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.gz
mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.bz2
mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.xz
mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.zip
Add mw 1.23.15 themes
-rw-r--r--CologneBlue.php573
-rw-r--r--Modern.php169
-rw-r--r--MonoBook.php332
-rw-r--r--Vector.php463
-rw-r--r--cologneblue/print.css6
-rw-r--r--cologneblue/screen.css277
-rw-r--r--common/IEFixes.js121
-rw-r--r--common/ajax.js193
-rw-r--r--common/commonContent.css151
-rw-r--r--common/commonElements.css235
-rw-r--r--common/commonInterface.css68
-rw-r--r--common/commonPrint.css401
-rw-r--r--common/config-cc.css57
-rw-r--r--common/config.css143
-rw-r--r--common/config.js108
-rw-r--r--common/feed.css95
-rw-r--r--common/images/Arr_.pngbin0 -> 96 bytes
-rw-r--r--common/images/Arr_d.pngbin0 -> 205 bytes
-rw-r--r--common/images/Arr_l.pngbin0 -> 205 bytes
-rw-r--r--common/images/Arr_r.pngbin0 -> 206 bytes
-rw-r--r--common/images/Arr_u.pngbin0 -> 207 bytes
-rw-r--r--common/images/Checker-16x16.pngbin0 -> 81 bytes
-rw-r--r--common/images/Zoom_sans.gifbin0 -> 901 bytes
-rw-r--r--common/images/add.pngbin0 -> 526 bytes
-rw-r--r--common/images/ajax-loader.gifbin0 -> 1788 bytes
-rw-r--r--common/images/ar/button_bold.pngbin0 -> 533 bytes
-rw-r--r--common/images/ar/button_headline.pngbin0 -> 484 bytes
-rw-r--r--common/images/ar/button_italic.pngbin0 -> 532 bytes
-rw-r--r--common/images/ar/button_link.pngbin0 -> 557 bytes
-rw-r--r--common/images/ar/button_nowiki.pngbin0 -> 874 bytes
-rw-r--r--common/images/arrow_disabled_first_25.pngbin0 -> 318 bytes
-rw-r--r--common/images/arrow_disabled_last_25.pngbin0 -> 323 bytes
-rw-r--r--common/images/arrow_disabled_left_25.pngbin0 -> 301 bytes
-rw-r--r--common/images/arrow_disabled_right_25.pngbin0 -> 307 bytes
-rw-r--r--common/images/arrow_first_25.pngbin0 -> 352 bytes
-rw-r--r--common/images/arrow_last_25.pngbin0 -> 342 bytes
-rw-r--r--common/images/arrow_left_25.pngbin0 -> 330 bytes
-rw-r--r--common/images/arrow_right_25.pngbin0 -> 337 bytes
-rw-r--r--common/images/be-tarask/button_bold.pngbin0 -> 550 bytes
-rw-r--r--common/images/be-tarask/button_italic.pngbin0 -> 539 bytes
-rw-r--r--common/images/be-tarask/button_link.pngbin0 -> 419 bytes
-rw-r--r--common/images/bullet.gifbin0 -> 50 bytes
-rw-r--r--common/images/button_bold.pngbin0 -> 250 bytes
-rw-r--r--common/images/button_extlink.pngbin0 -> 435 bytes
-rw-r--r--common/images/button_headline.pngbin0 -> 440 bytes
-rw-r--r--common/images/button_hr.pngbin0 -> 200 bytes
-rw-r--r--common/images/button_image.pngbin0 -> 483 bytes
-rw-r--r--common/images/button_italic.pngbin0 -> 250 bytes
-rw-r--r--common/images/button_link.pngbin0 -> 280 bytes
-rw-r--r--common/images/button_media.pngbin0 -> 728 bytes
-rw-r--r--common/images/button_nowiki.pngbin0 -> 322 bytes
-rw-r--r--common/images/button_sig.pngbin0 -> 920 bytes
-rw-r--r--common/images/button_template.pngbin0 -> 178 bytes
-rw-r--r--common/images/cc-0.pngbin0 -> 969 bytes
-rw-r--r--common/images/cc-by-nc-sa.pngbin0 -> 1530 bytes
-rw-r--r--common/images/cc-by-sa.pngbin0 -> 1377 bytes
-rw-r--r--common/images/cc-by.pngbin0 -> 1165 bytes
-rw-r--r--common/images/closewindow.pngbin0 -> 108 bytes
-rw-r--r--common/images/closewindow19x19.pngbin0 -> 833 bytes
-rw-r--r--common/images/critical-32.pngbin0 -> 1758 bytes
-rw-r--r--common/images/cyrl/LICENSE17
-rw-r--r--common/images/cyrl/button_bold.pngbin0 -> 254 bytes
-rw-r--r--common/images/cyrl/button_italic.pngbin0 -> 423 bytes
-rw-r--r--common/images/cyrl/button_link.pngbin0 -> 278 bytes
-rw-r--r--common/images/de/button_bold.pngbin0 -> 255 bytes
-rw-r--r--common/images/de/button_italic.pngbin0 -> 260 bytes
-rw-r--r--common/images/diffunderline.gifbin0 -> 52 bytes
-rw-r--r--common/images/download-32.pngbin0 -> 1759 bytes
-rw-r--r--common/images/fa/button_bold.pngbin0 -> 459 bytes
-rw-r--r--common/images/fa/button_headline.pngbin0 -> 392 bytes
-rw-r--r--common/images/fa/button_italic.pngbin0 -> 512 bytes
-rw-r--r--common/images/fa/button_link.pngbin0 -> 485 bytes
-rw-r--r--common/images/fa/button_nowiki.pngbin0 -> 874 bytes
-rw-r--r--common/images/feed-icon.pngbin0 -> 542 bytes
-rw-r--r--common/images/feed-icon.svg1
-rw-r--r--common/images/gnu-fdl.pngbin0 -> 1573 bytes
-rw-r--r--common/images/help-question-hover.gifbin0 -> 1246 bytes
-rw-r--r--common/images/help-question.gifbin0 -> 126 bytes
-rw-r--r--common/images/icons/COPYING43
-rw-r--r--common/images/icons/fileicon-c.pngbin0 -> 1753 bytes
-rw-r--r--common/images/icons/fileicon-cpp.pngbin0 -> 1382 bytes
-rw-r--r--common/images/icons/fileicon-deb.pngbin0 -> 4527 bytes
-rw-r--r--common/images/icons/fileicon-djvu.pngbin0 -> 10436 bytes
-rw-r--r--common/images/icons/fileicon-djvu.xcfbin0 -> 83394 bytes
-rw-r--r--common/images/icons/fileicon-dvi.pngbin0 -> 12476 bytes
-rw-r--r--common/images/icons/fileicon-exe.pngbin0 -> 5469 bytes
-rw-r--r--common/images/icons/fileicon-h.pngbin0 -> 803 bytes
-rw-r--r--common/images/icons/fileicon-html.pngbin0 -> 7171 bytes
-rw-r--r--common/images/icons/fileicon-iso.pngbin0 -> 6105 bytes
-rw-r--r--common/images/icons/fileicon-java.pngbin0 -> 5706 bytes
-rw-r--r--common/images/icons/fileicon-mid.pngbin0 -> 6316 bytes
-rw-r--r--common/images/icons/fileicon-mov.pngbin0 -> 7579 bytes
-rw-r--r--common/images/icons/fileicon-o.pngbin0 -> 1742 bytes
-rw-r--r--common/images/icons/fileicon-ogg.pngbin0 -> 3151 bytes
-rw-r--r--common/images/icons/fileicon-ogg.xcfbin0 -> 40236 bytes
-rw-r--r--common/images/icons/fileicon-pdf.pngbin0 -> 4710 bytes
-rw-r--r--common/images/icons/fileicon-ps.pngbin0 -> 2786 bytes
-rw-r--r--common/images/icons/fileicon-psd.pngbin0 -> 7756 bytes
-rw-r--r--common/images/icons/fileicon-rm.pngbin0 -> 2519 bytes
-rw-r--r--common/images/icons/fileicon-rpm.pngbin0 -> 3784 bytes
-rw-r--r--common/images/icons/fileicon-svg.pngbin0 -> 4793 bytes
-rw-r--r--common/images/icons/fileicon-tar.pngbin0 -> 6025 bytes
-rw-r--r--common/images/icons/fileicon-tex.pngbin0 -> 3738 bytes
-rw-r--r--common/images/icons/fileicon-ttf.pngbin0 -> 3193 bytes
-rw-r--r--common/images/icons/fileicon-txt.pngbin0 -> 3388 bytes
-rw-r--r--common/images/icons/fileicon.pngbin0 -> 789 bytes
-rw-r--r--common/images/info-32.pngbin0 -> 1892 bytes
-rw-r--r--common/images/ksh/LICENSE7
-rw-r--r--common/images/ksh/button_S_italic.pngbin0 -> 368 bytes
-rw-r--r--common/images/link_icon.gifbin0 -> 342 bytes
-rw-r--r--common/images/magnify-clip-rtl.pngbin0 -> 149 bytes
-rw-r--r--common/images/magnify-clip.pngbin0 -> 204 bytes
-rw-r--r--common/images/mediawiki.pngbin0 -> 22589 bytes
-rw-r--r--common/images/nextredirectltr.pngbin0 -> 121 bytes
-rw-r--r--common/images/nextredirectrtl.pngbin0 -> 121 bytes
-rw-r--r--common/images/poweredby_mediawiki_88x31.pngbin0 -> 3525 bytes
-rw-r--r--common/images/public-domain.pngbin0 -> 2017 bytes
-rw-r--r--common/images/question-small.pngbin0 -> 316 bytes
-rw-r--r--common/images/question.svg1
-rw-r--r--common/images/redirectltr.pngbin0 -> 128 bytes
-rw-r--r--common/images/redirectrtl.pngbin0 -> 132 bytes
-rw-r--r--common/images/remove.pngbin0 -> 555 bytes
-rw-r--r--common/images/spinner.gifbin0 -> 1819 bytes
-rw-r--r--common/images/tick-32.pngbin0 -> 1103 bytes
-rw-r--r--common/images/tipsy-arrow.gifbin0 -> 205 bytes
-rw-r--r--common/images/tooltip_icon.pngbin0 -> 352 bytes
-rw-r--r--common/images/warning-32.pngbin0 -> 1299 bytes
-rw-r--r--common/images/wiki.pngbin0 -> 24358 bytes
-rw-r--r--common/oldshared.css469
-rw-r--r--common/protect.js387
-rw-r--r--common/shared.css1216
-rw-r--r--common/upload.js355
-rw-r--r--common/wikibits.js243
-rw-r--r--modern/audio.pngbin0 -> 186 bytes
-rw-r--r--modern/bullet.gifbin0 -> 50 bytes
-rw-r--r--modern/discussionitem_icon.gifbin0 -> 549 bytes
-rw-r--r--modern/document.pngbin0 -> 152 bytes
-rw-r--r--modern/external.pngbin0 -> 141 bytes
-rw-r--r--modern/file_icon.gifbin0 -> 323 bytes
-rw-r--r--modern/footer-grad.pngbin0 -> 81 bytes
-rw-r--r--modern/link_icon.gifbin0 -> 342 bytes
-rw-r--r--modern/lock_icon.gifbin0 -> 321 bytes
-rw-r--r--modern/mail_icon.gifbin0 -> 321 bytes
-rw-r--r--modern/main.css912
-rw-r--r--modern/news_icon.pngbin0 -> 284 bytes
-rw-r--r--modern/print.css10
-rw-r--r--modern/video.pngbin0 -> 113 bytes
-rw-r--r--monobook/IE60Fixes.css112
-rw-r--r--monobook/IE70Fixes.css92
-rw-r--r--monobook/audio.pngbin0 -> 186 bytes
-rw-r--r--monobook/bullet.gifbin0 -> 50 bytes
-rw-r--r--monobook/discussionitem_icon.gifbin0 -> 549 bytes
-rw-r--r--monobook/document.pngbin0 -> 152 bytes
-rw-r--r--monobook/external-ltr.pngbin0 -> 141 bytes
-rw-r--r--monobook/external-rtl.pngbin0 -> 141 bytes
-rw-r--r--monobook/file_icon.gifbin0 -> 323 bytes
-rw-r--r--monobook/headbg.jpgbin0 -> 7881 bytes
-rw-r--r--monobook/link_icon.gifbin0 -> 342 bytes
-rw-r--r--monobook/lock_icon.gifbin0 -> 918 bytes
-rw-r--r--monobook/magnify-clip.pngbin0 -> 170 bytes
-rw-r--r--monobook/mail_icon.gifbin0 -> 321 bytes
-rw-r--r--monobook/main.css835
-rw-r--r--monobook/news_icon.pngbin0 -> 284 bytes
-rw-r--r--monobook/required.gifbin0 -> 47 bytes
-rw-r--r--monobook/user.gifbin0 -> 325 bytes
-rw-r--r--monobook/video.pngbin0 -> 116 bytes
-rw-r--r--monobook/wiki-indexed.pngbin0 -> 8007 bytes
-rw-r--r--monobook/wiki.pngbin0 -> 22589 bytes
-rw-r--r--vector/collapsibleNav.js152
-rw-r--r--vector/collapsibleTabs.js208
-rw-r--r--vector/components/animations.less28
-rw-r--r--vector/components/collapsibleNav.less91
-rw-r--r--vector/components/common.less141
-rw-r--r--vector/components/externalLinks.less10
-rw-r--r--vector/components/footer.less57
-rw-r--r--vector/components/navigation.less134
-rw-r--r--vector/components/notifications.less20
-rw-r--r--vector/components/personalMenu.less41
-rw-r--r--vector/components/search.less113
-rw-r--r--vector/components/tabs.less274
-rw-r--r--vector/components/watchstar.less46
-rw-r--r--vector/csshover.htc284
-rw-r--r--vector/csshover.min.htc12
-rw-r--r--vector/images/arrow-collapsed-ltr.pngbin0 -> 143 bytes
-rw-r--r--vector/images/arrow-collapsed-ltr.svg1
-rw-r--r--vector/images/arrow-collapsed-rtl.pngbin0 -> 145 bytes
-rw-r--r--vector/images/arrow-collapsed-rtl.svg1
-rw-r--r--vector/images/arrow-down-focus-icon.pngbin0 -> 135 bytes
-rw-r--r--vector/images/arrow-down-focus-icon.svg1
-rw-r--r--vector/images/arrow-down-icon.pngbin0 -> 135 bytes
-rw-r--r--vector/images/arrow-down-icon.svg1
-rw-r--r--vector/images/arrow-expanded.pngbin0 -> 145 bytes
-rw-r--r--vector/images/arrow-expanded.svg1
-rw-r--r--vector/images/bullet-icon.pngbin0 -> 107 bytes
-rw-r--r--vector/images/external-link-ltr-icon.pngbin0 -> 141 bytes
-rw-r--r--vector/images/external-link-ltr-icon.svg1
-rw-r--r--vector/images/external-link-rtl-icon.pngbin0 -> 141 bytes
-rw-r--r--vector/images/external-link-rtl-icon.svg1
-rw-r--r--vector/images/link-icon.pngbin0 -> 359 bytes
-rw-r--r--vector/images/magnify-clip.pngbin0 -> 204 bytes
-rw-r--r--vector/images/page-fade.pngbin0 -> 115 bytes
-rw-r--r--vector/images/portal-break-ltr.pngbin0 -> 168 bytes
-rw-r--r--vector/images/portal-break-rtl.pngbin0 -> 161 bytes
-rw-r--r--vector/images/portal-break.pngbin0 -> 96 bytes
-rw-r--r--vector/images/preferences/break.pngbin0 -> 103 bytes
-rw-r--r--vector/images/preferences/fade.pngbin0 -> 85 bytes
-rw-r--r--vector/images/search-fade.pngbin0 -> 94 bytes
-rw-r--r--vector/images/search-ltr.pngbin0 -> 214 bytes
-rw-r--r--vector/images/search-ltr.svg1
-rw-r--r--vector/images/search-rtl.pngbin0 -> 214 bytes
-rw-r--r--vector/images/search-rtl.svg1
-rw-r--r--vector/images/tab-break.pngbin0 -> 125 bytes
-rw-r--r--vector/images/tab-current-fade.pngbin0 -> 70 bytes
-rw-r--r--vector/images/tab-normal-fade.pngbin0 -> 117 bytes
-rw-r--r--vector/images/unwatch-icon-hl.pngbin0 -> 716 bytes
-rw-r--r--vector/images/unwatch-icon-hl.svg1
-rw-r--r--vector/images/unwatch-icon.pngbin0 -> 658 bytes
-rw-r--r--vector/images/unwatch-icon.svg1
-rw-r--r--vector/images/user-icon.pngbin0 -> 568 bytes
-rw-r--r--vector/images/user-icon.svg1
-rw-r--r--vector/images/watch-icon-hl.pngbin0 -> 640 bytes
-rw-r--r--vector/images/watch-icon-hl.svg1
-rw-r--r--vector/images/watch-icon-loading.pngbin0 -> 485 bytes
-rw-r--r--vector/images/watch-icon-loading.svg1
-rw-r--r--vector/images/watch-icon.pngbin0 -> 642 bytes
-rw-r--r--vector/images/watch-icon.svg1
-rw-r--r--vector/screen-hd.less30
-rw-r--r--vector/screen.less10
-rw-r--r--vector/special.less7
-rw-r--r--vector/special.preferences.less114
-rw-r--r--vector/variables.less43
-rw-r--r--vector/vector.js55
232 files changed, 9977 insertions, 0 deletions
diff --git a/CologneBlue.php b/CologneBlue.php
new file mode 100644
index 0000000..7c2860e
--- /dev/null
+++ b/CologneBlue.php
@@ -0,0 +1,573 @@
+<?php
+/**
+ * Cologne Blue: A nicer-looking alternative to Standard.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @todo document
+ * @file
+ * @ingroup Skins
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( -1 );
+}
+
+/**
+ * @todo document
+ * @ingroup Skins
+ */
+class SkinCologneBlue extends SkinTemplate {
+ var $skinname = 'cologneblue', $stylename = 'cologneblue',
+ $template = 'CologneBlueTemplate';
+ var $useHeadElement = true;
+
+ /**
+ * @param $out OutputPage
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+ $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
+ $out->addModuleStyles( 'skins.cologneblue' );
+ }
+
+ /**
+ * Override langlink formatting behavior not to uppercase the language names.
+ * See otherLanguages() in CologneBlueTemplate.
+ */
+ function formatLanguageName( $name ) {
+ return $name;
+ }
+}
+
+class CologneBlueTemplate extends BaseTemplate {
+ function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
+ $this->html( 'headelement' );
+ echo $this->beforeContent();
+ $this->html( 'bodytext' );
+ echo "\n";
+ echo $this->afterContent();
+ $this->html( 'dataAfterContent' );
+ $this->printTrail();
+ echo "\n</body></html>";
+ wfRestoreWarnings();
+ }
+
+ /**
+ * Language/charset variant links for classic-style skins
+ * @return string
+ */
+ function variantLinks() {
+ $s = array();
+
+ $variants = $this->data['content_navigation']['variants'];
+
+ foreach ( $variants as $key => $link ) {
+ $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) );
+ }
+
+ return $this->getSkin()->getLanguage()->pipeList( $s );
+ }
+
+ function otherLanguages() {
+ global $wgHideInterlanguageLinks;
+ if ( $wgHideInterlanguageLinks ) {
+ return "";
+ }
+
+ $html = '';
+
+ // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
+ // not to capitalize the language names.
+ $language_urls = $this->data['language_urls'];
+ if ( !empty( $language_urls ) ) {
+ $s = array();
+ foreach ( $language_urls as $key => $data ) {
+ $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+ }
+
+ $html = wfMessage( 'otherlanguages' )->text()
+ . wfMessage( 'colon-separator' )->text()
+ . $this->getSkin()->getLanguage()->pipeList( $s );
+ }
+
+ $html .= $this->renderAfterPortlet( 'lang' );
+
+ return $html;
+ }
+
+ /**
+ * @param string $name
+ */
+ protected function renderAfterPortlet( $name ) {
+ $content = '';
+ wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+ $html = $content !== '' ? "<div class='after-portlet after-portlet-$name'>$content</div>" : '';
+
+ return $html;
+ }
+
+ function pageTitleLinks() {
+ $s = array();
+ $footlinks = $this->getFooterLinks();
+
+ foreach ( $footlinks['places'] as $item ) {
+ $s[] = $this->data[$item];
+ }
+
+ return $this->getSkin()->getLanguage()->pipeList( $s );
+ }
+
+ /**
+ * Used in bottomLinks() to eliminate repetitive code.
+ *
+ * @param $key string Key to be passed to makeListItem()
+ * @param $navlink array Navlink suitable for processNavlinkForDocument()
+ * @param $message string Key of the message to use in place of standard text
+ *
+ * @return string
+ */
+ function processBottomLink( $key, $navlink, $message = null ) {
+ if ( !$navlink ) {
+ // Empty navlinks might be passed.
+ return null;
+ }
+
+ if ( $message ) {
+ $navlink['text'] = wfMessage( $message )->escaped();
+ }
+
+ return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) );
+ }
+
+ function bottomLinks() {
+ $toolbox = $this->getToolbox();
+ $content_nav = $this->data['content_navigation'];
+
+ $lines = array();
+
+ if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
+ // First row. Regular actions.
+ $element = array();
+
+ $editLinkMessage = $this->getSkin()->getTitle()->exists() ? 'editthispage' : 'create-this-page';
+ $element[] = $this->processBottomLink( 'edit', $content_nav['views']['edit'], $editLinkMessage );
+ $element[] = $this->processBottomLink( 'viewsource', $content_nav['views']['viewsource'], 'viewsource' );
+
+ $element[] = $this->processBottomLink( 'watch', $content_nav['actions']['watch'], 'watchthispage' );
+ $element[] = $this->processBottomLink( 'unwatch', $content_nav['actions']['unwatch'], 'unwatchthispage' );
+
+ $element[] = $this->talkLink();
+
+ $element[] = $this->processBottomLink( 'history', $content_nav['views']['history'], 'history' );
+ $element[] = $this->processBottomLink( 'info', $toolbox['info'] );
+ $element[] = $this->processBottomLink( 'whatlinkshere', $toolbox['whatlinkshere'] );
+ $element[] = $this->processBottomLink( 'recentchangeslinked', $toolbox['recentchangeslinked'] );
+
+ $element[] = $this->processBottomLink( 'contributions', $toolbox['contributions'] );
+ $element[] = $this->processBottomLink( 'emailuser', $toolbox['emailuser'] );
+
+ $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
+
+ // Second row. Privileged actions.
+ $element = array();
+
+ $element[] = $this->processBottomLink( 'delete', $content_nav['actions']['delete'], 'deletethispage' );
+ $element[] = $this->processBottomLink( 'undelete', $content_nav['actions']['undelete'], 'undeletethispage' );
+
+ $element[] = $this->processBottomLink( 'protect', $content_nav['actions']['protect'], 'protectthispage' );
+ $element[] = $this->processBottomLink( 'unprotect', $content_nav['actions']['unprotect'], 'unprotectthispage' );
+
+ $element[] = $this->processBottomLink( 'move', $content_nav['actions']['move'], 'movethispage' );
+
+ $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
+
+ // Third row. Language links.
+ $lines[] = $this->otherLanguages();
+ }
+
+ return implode( array_filter( $lines ), "<br />\n" ) . "<br />\n";
+ }
+
+ function talkLink() {
+ $title = $this->getSkin()->getTitle();
+
+ if ( $title->getNamespace() == NS_SPECIAL ) {
+ // No discussion links for special pages
+ return "";
+ }
+
+ $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
+ $companionNamespace = $companionTitle->getNamespace();
+
+ // TODO these messages are only be used by CologneBlue,
+ // kill and replace with something more sensibly named?
+ $nsToMessage = array(
+ NS_MAIN => 'articlepage',
+ NS_USER => 'userpage',
+ NS_PROJECT => 'projectpage',
+ NS_FILE => 'imagepage',
+ NS_MEDIAWIKI => 'mediawikipage',
+ NS_TEMPLATE => 'templatepage',
+ NS_HELP => 'viewhelppage',
+ NS_CATEGORY => 'categorypage',
+ NS_FILE => 'imagepage',
+ );
+
+ // Find out the message to use for link text. Use either the array above or,
+ // for non-talk pages, a generic "discuss this" message.
+ // Default is the same as for main namespace.
+ if ( isset( $nsToMessage[$companionNamespace] ) ) {
+ $message = $nsToMessage[$companionNamespace];
+ } else {
+ $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage';
+ }
+
+ // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones.
+ // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805)
+ $key = $companionTitle->getNamespaceKey( '' );
+ if ( $companionTitle->isTalkPage() ) {
+ $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
+ }
+
+ // Use the regular navigational link, but replace its text. Everything else stays unmodified.
+ $namespacesLinks = $this->data['content_navigation']['namespaces'];
+ return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
+ }
+
+ /**
+ * Takes a navigational link generated by SkinTemplate in whichever way
+ * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids
+ * and removes the accesskeys. This is necessary to be able to use the same navlink twice,
+ * e.g. in sidebar and in footer.
+ *
+ * @param $navlink array Navigational link generated by SkinTemplate
+ * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
+ */
+ function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
+ if ( $navlink['id'] ) {
+ $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
+ $navlink['tooltiponly'] = true; // but no accesskeys
+
+ // mangle or remove the id
+ if ( $idPrefix === false ) {
+ unset( $navlink['id'] );
+ } else {
+ $navlink['id'] = $idPrefix . $navlink['id'];
+ }
+ }
+
+ return $navlink;
+ }
+
+ /**
+ * @return string
+ */
+ function beforeContent() {
+ ob_start();
+?>
+<div id="content">
+ <div id="topbar">
+ <p id="sitetitle" role="banner">
+ <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>">
+ <?php echo wfMessage( 'sitetitle' )->escaped() ?>
+ </a>
+ </p>
+ <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
+ <div id="linkcollection" role="navigation">
+ <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div>
+ <?php echo $this->getSkin()->getCategories() ?>
+ <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div>
+ <?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div>
+ <?php } ?>
+ </div>
+ </div>
+ <div id="article" class="mw-body" role="main">
+ <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
+ <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
+ <?php } ?>
+ <h1 id="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
+ <?php if ( $this->translator->translate( 'tagline' ) ) { ?>
+ <p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
+ <?php } ?>
+ <?php if ( $this->getSkin()->getOutput()->getSubtitle() ) { ?>
+ <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p>
+ <?php } ?>
+ <?php if ( $this->getSkin()->subPageSubtitle() ) { ?>
+ <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p>
+ <?php } ?>
+<?php
+ $s = ob_get_contents();
+ ob_end_clean();
+
+ return $s;
+ }
+
+ /**
+ * @return string
+ */
+ function afterContent() {
+ ob_start();
+?>
+ </div>
+ <div id="footer">
+ <div id="footer-navigation" role="navigation">
+<?php
+ // Page-related links
+ echo $this->bottomLinks();
+ echo "\n<br />";
+
+ // Footer and second searchbox
+ echo $this->getSkin()->getLanguage()->pipeList( array(
+ $this->getSkin()->mainPageLink(),
+ $this->getSkin()->aboutLink(),
+ $this->searchForm( 'footer' )
+ ) );
+?>
+ </div>
+ <div id="footer-info" role="contentinfo">
+<?php
+ // Standard footer info
+ $footlinks = $this->getFooterLinks();
+ if ( $footlinks['info'] ) {
+ foreach ( $footlinks['info'] as $item ) {
+ echo $this->data[$item] . ' ';
+ }
+ }
+?>
+ </div>
+ </div>
+</div>
+<div id="mw-navigation">
+ <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2>
+ <div id="toplinks" role="navigation">
+ <p id="syslinks"><?php echo $this->sysLinks() ?></p>
+ <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
+ </div>
+ <?php echo $this->quickBar() ?>
+</div>
+<?php
+ $s = ob_get_contents();
+ ob_end_clean();
+
+ return $s;
+ }
+
+ /**
+ * @return string
+ */
+ function sysLinks() {
+ $s = array(
+ $this->getSkin()->mainPageLink(),
+ Linker::linkKnown(
+ Title::newFromText( wfMessage( 'aboutpage' )->inContentLanguage()->text() ),
+ wfMessage( 'about' )->text()
+ ),
+ Linker::makeExternalLink(
+ Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ),
+ wfMessage( 'help' )->text(),
+ false
+ ),
+ Linker::linkKnown(
+ Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ),
+ wfMessage( 'faq' )->text()
+ ),
+ );
+
+ $personalUrls = $this->getPersonalTools();
+ foreach ( array( 'logout', 'createaccount', 'login' ) as $key ) {
+ if ( $personalUrls[$key] ) {
+ $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
+ }
+ }
+
+ return $this->getSkin()->getLanguage()->pipeList( $s );
+ }
+
+ /**
+ * Adds CologneBlue-specific items to the sidebar: qbedit, qbpageoptions and qbmyoptions menus.
+ *
+ * @param $bar sidebar data
+ * @return array modified sidebar data
+ */
+ function sidebarAdditions( $bar ) {
+ // "This page" and "Edit" menus
+ // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
+ // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
+ // We also don't use $...['variants'], these are displayed in the top menu.
+ $content_navigation = $this->data['content_navigation'];
+ $qbpageoptions = array_merge(
+ $content_navigation['namespaces'],
+ array(
+ 'history' => $content_navigation['views']['history'],
+ 'watch' => $content_navigation['actions']['watch'],
+ 'unwatch' => $content_navigation['actions']['unwatch'],
+ )
+ );
+ $content_navigation['actions']['watch'] = null;
+ $content_navigation['actions']['unwatch'] = null;
+ $qbedit = array_merge(
+ array(
+ 'edit' => $content_navigation['views']['edit'],
+ 'addsection' => $content_navigation['views']['addsection'],
+ ),
+ $content_navigation['actions']
+ );
+
+ // Personal tools ("My pages")
+ $qbmyoptions = $this->getPersonalTools();
+ foreach ( array( 'logout', 'createaccount', 'login', ) as $key ) {
+ $qbmyoptions[$key] = null;
+ }
+
+ // Use the closest reasonable name
+ $bar['cactions'] = $qbedit;
+ $bar['pageoptions'] = $qbpageoptions; // this is a non-standard portlet name, but nothing fits
+ $bar['personal'] = $qbmyoptions;
+
+ return $bar;
+ }
+
+ /**
+ * Compute the sidebar
+ * @access private
+ *
+ * @return string
+ */
+ function quickBar() {
+ // Massage the sidebar. We want to:
+ // * place SEARCH at the beginning
+ // * add new portlets before TOOLBOX (or at the end, if it's missing)
+ // * remove LANGUAGES (langlinks are displayed elsewhere)
+ $orig_bar = $this->data['sidebar'];
+ $bar = array();
+ $hasToolbox = false;
+
+ // Always display search first
+ $bar['SEARCH'] = true;
+ // Copy everything except for langlinks, inserting new items before toolbox
+ foreach ( $orig_bar as $heading => $data ) {
+ if ( $heading == 'TOOLBOX' ) {
+ // Insert the stuff
+ $bar = $this->sidebarAdditions( $bar );
+ $hasToolbox = true;
+ }
+
+ if ( $heading != 'LANGUAGES' ) {
+ $bar[$heading] = $data;
+ }
+ }
+ // If toolbox is missing, add our items at the end
+ if ( !$hasToolbox ) {
+ $bar = $this->sidebarAdditions( $bar );
+ }
+
+ // Fill out special sidebar items with content
+ $orig_bar = $bar;
+ $bar = array();
+ foreach ( $orig_bar as $heading => $data ) {
+ if ( $heading == 'SEARCH' ) {
+ $bar['search'] = $this->searchForm( 'sidebar' );
+ } elseif ( $heading == 'TOOLBOX' ) {
+ $bar['tb'] = $this->getToolbox();
+ } else {
+ $bar[$heading] = $data;
+ }
+ }
+
+ // Output the sidebar
+ // CologneBlue uses custom messages for some portlets, but we should keep the ids for consistency
+ $idToMessage = array(
+ 'search' => 'qbfind',
+ 'navigation' => 'qbbrowse',
+ 'tb' => 'toolbox',
+ 'cactions' => 'qbedit',
+ 'personal' => 'qbmyoptions',
+ 'pageoptions' => 'qbpageoptions',
+ );
+
+ $s = "<div id='quickbar'>\n";
+
+ foreach ( $bar as $heading => $data ) {
+ $portletId = Sanitizer::escapeId( "p-$heading" );
+ $headingMsg = wfMessage( $idToMessage[$heading] ? $idToMessage[$heading] : $heading );
+ $headingHTML = "<h3>" . ( $headingMsg->exists() ? $headingMsg->escaped() : htmlspecialchars( $heading ) ) . "</h3>";
+ $listHTML = "";
+
+ if ( is_array( $data ) ) {
+ // $data is an array of links
+ foreach ( $data as $key => $link ) {
+ // Can be empty due to how the sidebar additions are done
+ if ( $link ) {
+ $listHTML .= $this->makeListItem( $key, $link );
+ }
+ }
+ if ( $listHTML ) {
+ $listHTML = "<ul>$listHTML</ul>";
+ }
+ } else {
+ // $data is a HTML <ul>-list string
+ $listHTML = $data;
+ }
+
+ if ( $listHTML ) {
+ $role = ( $heading == 'search' ) ? 'search' : 'navigation';
+ $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
+ }
+
+ $s .= $this->renderAfterPortlet( $heading );
+ }
+
+ $s .= "</div>\n";
+ return $s;
+ }
+
+ /**
+ * @param $label string
+ * @return string
+ */
+ function searchForm( $which ) {
+ global $wgUseTwoButtonsSearchForm;
+
+ $search = $this->getSkin()->getRequest()->getText( 'search' );
+ $action = $this->data['searchaction'];
+ $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+ if ( $which == 'footer' ) {
+ $s .= wfMessage( 'qbfind' )->text() . ": ";
+ }
+
+ $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
+ $s .= ( $which == 'footer' ? " " : "<br />" );
+ $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
+
+ if ( $wgUseTwoButtonsSearchForm ) {
+ $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
+ } else {
+ $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
+ }
+
+ $s .= '</form>';
+
+ return $s;
+ }
+}
diff --git a/Modern.php b/Modern.php
new file mode 100644
index 0000000..8d778cf
--- /dev/null
+++ b/Modern.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Modern skin, derived from monobook template.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @todo document
+ * @file
+ * @ingroup Skins
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( -1 );
+}
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @todo document
+ * @ingroup Skins
+ */
+class SkinModern extends SkinTemplate {
+ var $skinname = 'modern', $stylename = 'modern',
+ $template = 'ModernTemplate', $useHeadElement = true;
+
+ /**
+ * @param $out OutputPage
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+ $out->addModuleStyles( 'skins.modern' );
+ }
+}
+
+/**
+ * @todo document
+ * @ingroup Skins
+ */
+class ModernTemplate extends MonoBookTemplate {
+
+ /**
+ * Template filter callback for Modern skin.
+ * Takes an associative array of data set from a SkinTemplate-based
+ * class, and a wrapper for MediaWiki's localization database, and
+ * outputs a formatted page.
+ *
+ * @access private
+ */
+ function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
+
+ $this->html( 'headelement' );
+?>
+
+ <!-- heading -->
+ <div id="mw_header"><h1 id="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
+
+ <div id="mw_main">
+ <div id="mw_contentwrapper">
+ <!-- navigation portlet -->
+<?php $this->cactions(); ?>
+
+ <!-- content -->
+ <div id="mw_content" role="main">
+ <!-- contentholder does nothing by default, but it allows users to style the text inside
+ the content area without affecting the meaning of 'em' in #mw_content, which is used
+ for the margins -->
+ <div id="mw_contentholder" class="mw-body">
+ <div class='mw-topboxes'>
+ <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+ <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <?php if ( $this->data['newtalk'] ) {
+ ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
+ <?php } ?>
+ <?php if ( $this->data['sitenotice'] ) {
+ ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+ <?php } ?>
+ </div>
+
+ <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+
+ <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
+ <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
+ <?php $this->html( 'bodytext' ) ?>
+ <div class='mw_clear'></div>
+ <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+ <?php $this->html( 'dataAfterContent' ) ?>
+ </div><!-- mw_contentholder -->
+ </div><!-- mw_content -->
+ </div><!-- mw_contentwrapper -->
+
+ <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
+ <!-- portlets -->
+ <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+
+ </div><!-- mw_portlets -->
+
+
+ </div><!-- main -->
+
+ <div class="mw_clear"></div>
+
+ <!-- personal portlet -->
+ <div class="portlet" id="p-personal" role="navigation">
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
+ <div class="pBody">
+ <ul>
+<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
+
+<?php } ?>
+ </ul>
+ </div>
+ </div>
+
+
+ <!-- footer -->
+ <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+ <ul id="f-list">
+<?php
+ foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+ if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+?> <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+<?php }
+ }
+?>
+ </ul>
+<?php
+ foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
+ <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
+<?php
+ foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
+
+<?php
+ } ?>
+ </div>
+<?php
+ }
+?>
+ </div>
+
+ <?php $this->printTrail(); ?>
+</body></html>
+<?php
+ wfRestoreWarnings();
+ } // end of execute() method
+} // end of class
+
+
diff --git a/MonoBook.php b/MonoBook.php
new file mode 100644
index 0000000..9346ee0
--- /dev/null
+++ b/MonoBook.php
@@ -0,0 +1,332 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @todo document
+ * @file
+ * @ingroup Skins
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( -1 );
+}
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @todo document
+ * @ingroup Skins
+ */
+class SkinMonoBook extends SkinTemplate {
+ /** Using monobook. */
+ var $skinname = 'monobook', $stylename = 'monobook',
+ $template = 'MonoBookTemplate', $useHeadElement = true;
+
+ /**
+ * @param $out OutputPage
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+
+ $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
+
+ // TODO: Migrate all of these
+ $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
+ $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
+
+ }
+}
+
+/**
+ * @todo document
+ * @ingroup Skins
+ */
+class MonoBookTemplate extends BaseTemplate {
+
+ /**
+ * Template filter callback for MonoBook skin.
+ * Takes an associative array of data set from a SkinTemplate-based
+ * class, and a wrapper for MediaWiki's localization database, and
+ * outputs a formatted page.
+ *
+ * @access private
+ */
+ function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
+
+ $this->html( 'headelement' );
+?><div id="globalWrapper">
+<div id="column-content"><div id="content" class="mw-body-primary" role="main">
+ <a id="top"></a>
+ <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
+
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+ <div id="bodyContent" class="mw-body">
+ <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+<?php if ( $this->data['undelete'] ) { ?>
+ <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+<?php } ?>
+ <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
+ <!-- start content -->
+<?php $this->html( 'bodytext' ) ?>
+ <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+ <!-- end content -->
+ <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
+ <div class="visualClear"></div>
+ </div>
+</div></div>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+<?php $this->cactions(); ?>
+ <div class="portlet" id="p-personal" role="navigation">
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
+ <div class="pBody">
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
+
+<?php } ?>
+ </ul>
+ </div>
+ </div>
+ <div class="portlet" id="p-logo" role="banner">
+<?php
+ echo Html::element( 'a', array(
+ 'href' => $this->data['nav_urls']['mainpage']['href'],
+ 'style' => "background-image: url({$this->data['logopath']});" )
+ + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+ </div>
+<?php
+ $this->renderPortals( $this->data['sidebar'] );
+?>
+</div><!-- end of the left (by default at least) column -->
+<div class="visualClear"></div>
+<?php
+ $validFooterIcons = $this->getFooterIcons( "icononly" );
+ $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+ if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+<?php
+ $footerEnd = '</div>';
+ } else {
+ $footerEnd = '';
+ }
+ foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
+ <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+<?php foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+
+<?php }
+?>
+ </div>
+<?php }
+
+ if ( count( $validFooterLinks ) > 0 ) {
+?> <ul id="f-list">
+<?php
+ foreach ( $validFooterLinks as $aLink ) { ?>
+ <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+<?php
+ }
+?>
+ </ul>
+<?php }
+echo $footerEnd;
+?>
+
+</div>
+<?php
+ $this->printTrail();
+ echo Html::closeElement( 'body' );
+ echo Html::closeElement( 'html' );
+ wfRestoreWarnings();
+ } // end of execute() method
+
+ /*************************************************************************************************/
+
+ /**
+ * @param $sidebar array
+ */
+ protected function renderPortals( $sidebar ) {
+ if ( !isset( $sidebar['SEARCH'] ) ) {
+ $sidebar['SEARCH'] = true;
+ }
+ if ( !isset( $sidebar['TOOLBOX'] ) ) {
+ $sidebar['TOOLBOX'] = true;
+ }
+ if ( !isset( $sidebar['LANGUAGES'] ) ) {
+ $sidebar['LANGUAGES'] = true;
+ }
+
+ foreach ( $sidebar as $boxName => $content ) {
+ if ( $content === false ) {
+ continue;
+ }
+
+ if ( $boxName == 'SEARCH' ) {
+ $this->searchBox();
+ } elseif ( $boxName == 'TOOLBOX' ) {
+ $this->toolbox();
+ } elseif ( $boxName == 'LANGUAGES' ) {
+ $this->languageBox();
+ } else {
+ $this->customBox( $boxName, $content );
+ }
+ }
+ }
+
+ function searchBox() {
+ global $wgUseTwoButtonsSearchForm;
+?>
+ <div id="p-search" class="portlet" role="search">
+ <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+ <div id="searchBody" class="pBody">
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+ <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+ if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+ <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+ } else { ?>
+
+ <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+ } ?>
+
+ </form>
+
+ <?php $this->renderAfterPortlet( 'search' ); ?>
+ </div>
+ </div>
+<?php
+ }
+
+ /**
+ * Prints the cactions bar.
+ * Shared between MonoBook and Modern
+ */
+ function cactions() {
+?>
+ <div id="p-cactions" class="portlet" role="navigation">
+ <h3><?php $this->msg( 'views' ) ?></h3>
+ <div class="pBody">
+ <ul><?php
+ foreach ( $this->data['content_actions'] as $key => $tab ) {
+ echo '
+ ' . $this->makeListItem( $key, $tab );
+ } ?>
+
+ </ul>
+<?php $this->renderAfterPortlet( 'cactions' ); ?>
+ </div>
+ </div>
+<?php
+ }
+ /*************************************************************************************************/
+ function toolbox() {
+?>
+ <div class="portlet" id="p-tb" role="navigation">
+ <h3><?php $this->msg( 'toolbox' ) ?></h3>
+ <div class="pBody">
+ <ul>
+<?php
+ foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
+ <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+<?php
+ }
+ wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+ wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+?>
+ </ul>
+<?php $this->renderAfterPortlet( 'tb' ); ?>
+ </div>
+ </div>
+<?php
+ }
+
+ /*************************************************************************************************/
+ function languageBox() {
+ if ( $this->data['language_urls'] !== false ) {
+?>
+ <div id="p-lang" class="portlet" role="navigation">
+ <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
+ <div class="pBody">
+ <ul>
+<?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+ <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+<?php } ?>
+ </ul>
+
+<?php $this->renderAfterPortlet( 'lang' ); ?>
+ </div>
+ </div>
+<?php
+ }
+ }
+
+ /*************************************************************************************************/
+ /**
+ * @param $bar string
+ * @param $cont array|string
+ */
+ function customBox( $bar, $cont ) {
+ $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
+ $tooltip = Linker::titleAttrib( "p-$bar" );
+ if ( $tooltip !== false ) {
+ $portletAttribs['title'] = $tooltip;
+ }
+ echo ' ' . Html::openElement( 'div', $portletAttribs );
+ $msgObj = wfMessage( $bar );
+?>
+
+ <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
+ <div class='pBody'>
+<?php if ( is_array( $cont ) ) { ?>
+ <ul>
+<?php foreach ( $cont as $key => $val ) { ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
+
+<?php } ?>
+ </ul>
+<?php } else {
+ # allow raw HTML block to be defined by extensions
+ print $cont;
+ }
+
+ $this->renderAfterPortlet( $bar );
+?>
+ </div>
+ </div>
+<?php
+ }
+
+} // end of class
diff --git a/Vector.php b/Vector.php
new file mode 100644
index 0000000..594f1f6
--- /dev/null
+++ b/Vector.php
@@ -0,0 +1,463 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @todo document
+ * @file
+ * @ingroup Skins
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( -1 );
+}
+
+/**
+ * SkinTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class SkinVector extends SkinTemplate {
+
+ protected static $bodyClasses = array( 'vector-animateLayout' );
+
+ var $skinname = 'vector', $stylename = 'vector',
+ $template = 'VectorTemplate', $useHeadElement = true;
+
+ /**
+ * Initializes output page and sets up skin-specific parameters
+ * @param $out OutputPage object to initialize
+ */
+ public function initPage( OutputPage $out ) {
+ global $wgLocalStylePath;
+
+ parent::initPage( $out );
+
+ // Append CSS which includes IE only behavior fixes for hover support -
+ // this is better than including this in a CSS file since it doesn't
+ // wait for the CSS file to load before fetching the HTC file.
+ $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
+ $out->addHeadItem( 'csshover',
+ '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
+ htmlspecialchars( $wgLocalStylePath ) .
+ "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
+ );
+
+ $out->addModules( array( 'skins.vector.js', 'skins.vector.collapsibleNav' ) );
+ }
+
+ /**
+ * Loads skin and user CSS files.
+ * @param $out OutputPage object
+ */
+ function setupSkinUserCss( OutputPage $out ) {
+ parent::setupSkinUserCss( $out );
+
+ $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
+ wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
+ $out->addModuleStyles( $styles );
+ }
+
+ /**
+ * Adds classes to the body element.
+ *
+ * @param $out OutputPage object
+ * @param &$bodyAttrs Array of attributes that will be set on the body element
+ */
+ function addToBodyAttributes( $out, &$bodyAttrs ) {
+ if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
+ $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
+ } else {
+ $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
+ }
+ }
+}
+
+/**
+ * QuickTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class VectorTemplate extends BaseTemplate {
+
+ /* Functions */
+
+ /**
+ * Outputs the entire contents of the (X)HTML page
+ */
+ public function execute() {
+ global $wgVectorUseIconWatch;
+
+ // Build additional attributes for navigation urls
+ $nav = $this->data['content_navigation'];
+
+ if ( $wgVectorUseIconWatch ) {
+ $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() ) ? 'unwatch' : 'watch';
+ if ( isset( $nav['actions'][$mode] ) ) {
+ $nav['views'][$mode] = $nav['actions'][$mode];
+ $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
+ $nav['views'][$mode]['primary'] = true;
+ unset( $nav['actions'][$mode] );
+ }
+ }
+
+ $xmlID = '';
+ foreach ( $nav as $section => $links ) {
+ foreach ( $links as $key => $link ) {
+ if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
+ $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
+ }
+
+ $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
+ $nav[$section][$key]['attributes'] =
+ ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
+ if ( $link['class'] ) {
+ $nav[$section][$key]['attributes'] .=
+ ' class="' . htmlspecialchars( $link['class'] ) . '"';
+ unset( $nav[$section][$key]['class'] );
+ }
+ if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
+ $nav[$section][$key]['key'] =
+ Linker::tooltip( $xmlID );
+ } else {
+ $nav[$section][$key]['key'] =
+ Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
+ }
+ }
+ }
+ $this->data['namespace_urls'] = $nav['namespaces'];
+ $this->data['view_urls'] = $nav['views'];
+ $this->data['action_urls'] = $nav['actions'];
+ $this->data['variant_urls'] = $nav['variants'];
+
+ // Reverse horizontally rendered navigation elements
+ if ( $this->data['rtl'] ) {
+ $this->data['view_urls'] =
+ array_reverse( $this->data['view_urls'] );
+ $this->data['namespace_urls'] =
+ array_reverse( $this->data['namespace_urls'] );
+ $this->data['personal_urls'] =
+ array_reverse( $this->data['personal_urls'] );
+ }
+ // Output HTML Page
+ $this->html( 'headelement' );
+?>
+ <div id="mw-page-base" class="noprint"></div>
+ <div id="mw-head-base" class="noprint"></div>
+ <div id="content" class="mw-body" role="main">
+ <a id="top"></a>
+ <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+ <?php if ( $this->data['sitenotice'] ) { ?>
+ <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+ <?php } ?>
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+ <?php $this->html( 'prebodyhtml' ) ?>
+ <div id="bodyContent">
+ <?php if ( $this->data['isarticle'] ) { ?>
+ <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <?php } ?>
+ <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+ <?php if ( $this->data['undelete'] ) { ?>
+ <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+ <?php } ?>
+ <?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+ <?php } ?>
+ <div id="jump-to-nav" class="mw-jump">
+ <?php $this->msg( 'jumpto' ) ?>
+ <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
+ <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
+ </div>
+ <?php $this->html( 'bodycontent' ) ?>
+ <?php if ( $this->data['printfooter'] ) { ?>
+ <div class="printfooter">
+ <?php $this->html( 'printfooter' ); ?>
+ </div>
+ <?php } ?>
+ <?php if ( $this->data['catlinks'] ) { ?>
+ <?php $this->html( 'catlinks' ); ?>
+ <?php } ?>
+ <?php if ( $this->data['dataAfterContent'] ) { ?>
+ <?php $this->html( 'dataAfterContent' ); ?>
+ <?php } ?>
+ <div class="visualClear"></div>
+ <?php $this->html( 'debughtml' ); ?>
+ </div>
+ </div>
+ <div id="mw-navigation">
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+ <div id="mw-head">
+ <?php $this->renderNavigation( 'PERSONAL' ); ?>
+ <div id="left-navigation">
+ <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+ </div>
+ <div id="right-navigation">
+ <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+ </div>
+ </div>
+ <div id="mw-panel">
+ <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
+ <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+ </div>
+ </div>
+ <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+ <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
+ <ul id="footer-<?php echo $category ?>">
+ <?php foreach ( $links as $link ) { ?>
+ <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
+ <?php } ?>
+ </ul>
+ <?php } ?>
+ <?php $footericons = $this->getFooterIcons( "icononly" );
+ if ( count( $footericons ) > 0 ) { ?>
+ <ul id="footer-icons" class="noprint">
+<?php foreach ( $footericons as $blockName => $footerIcons ) { ?>
+ <li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
+<?php foreach ( $footerIcons as $icon ) { ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+
+<?php } ?>
+ </li>
+<?php } ?>
+ </ul>
+ <?php } ?>
+ <div style="clear:both"></div>
+ </div>
+ <?php $this->printTrail(); ?>
+
+ </body>
+</html>
+<?php
+ }
+
+ /**
+ * Render a series of portals
+ *
+ * @param $portals array
+ */
+ protected function renderPortals( $portals ) {
+ // Force the rendering of the following portals
+ if ( !isset( $portals['SEARCH'] ) ) {
+ $portals['SEARCH'] = true;
+ }
+ if ( !isset( $portals['TOOLBOX'] ) ) {
+ $portals['TOOLBOX'] = true;
+ }
+ if ( !isset( $portals['LANGUAGES'] ) ) {
+ $portals['LANGUAGES'] = true;
+ }
+ // Render portals
+ foreach ( $portals as $name => $content ) {
+ if ( $content === false ) {
+ continue;
+ }
+
+ switch ( $name ) {
+ case 'SEARCH':
+ break;
+ case 'TOOLBOX':
+ $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
+ break;
+ case 'LANGUAGES':
+ if ( $this->data['language_urls'] !== false ) {
+ $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
+ }
+ break;
+ default:
+ $this->renderPortal( $name, $content );
+ break;
+ }
+ }
+ }
+
+ /**
+ * @param $name string
+ * @param $content array
+ * @param $msg null|string
+ * @param $hook null|string|array
+ */
+ protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
+ if ( $msg === null ) {
+ $msg = $name;
+ }
+ $msgObj = wfMessage( $msg );
+ ?>
+<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+ <h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
+ <div class="body">
+<?php
+ if ( is_array( $content ) ) { ?>
+ <ul>
+<?php
+ foreach ( $content as $key => $val ) { ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
+
+<?php
+ }
+ if ( $hook !== null ) {
+ wfRunHooks( $hook, array( &$this, true ) );
+ }
+ ?>
+ </ul>
+<?php
+ } else { ?>
+ <?php
+ echo $content; /* Allow raw HTML block to be defined by extensions */
+ }
+
+ $this->renderAfterPortlet( $name );
+ ?>
+ </div>
+</div>
+<?php
+ }
+
+ /**
+ * Render one or more navigations elements by name, automatically reveresed
+ * when UI is in RTL mode
+ *
+ * @param $elements array
+ */
+ protected function renderNavigation( $elements ) {
+ global $wgVectorUseSimpleSearch;
+
+ // If only one element was given, wrap it in an array, allowing more
+ // flexible arguments
+ if ( !is_array( $elements ) ) {
+ $elements = array( $elements );
+ // If there's a series of elements, reverse them when in RTL mode
+ } elseif ( $this->data['rtl'] ) {
+ $elements = array_reverse( $elements );
+ }
+ // Render elements
+ foreach ( $elements as $name => $element ) {
+ switch ( $element ) {
+ case 'NAMESPACES':
+?>
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label">
+ <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php foreach ( $this->data['namespace_urls'] as $link ) { ?>
+ <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
+ <?php } ?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'VARIANTS':
+?>
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label">
+ <h3 id="mw-vector-current-variant">
+ <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
+ <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
+ <?php echo htmlspecialchars( $link['text'] ) ?>
+ <?php } ?>
+ <?php } ?>
+ </h3>
+ <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+ <div class="menu">
+ <ul>
+ <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
+ <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
+ <?php } ?>
+ </ul>
+ </div>
+</div>
+<?php
+ break;
+ case 'VIEWS':
+?>
+<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label">
+ <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php foreach ( $this->data['view_urls'] as $link ) { ?>
+ <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
+ // $link['text'] can be undefined - bug 27764
+ if ( array_key_exists( 'text', $link ) ) {
+ echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
+ }
+ ?></a></span></li>
+ <?php } ?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'ACTIONS':
+?>
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label">
+ <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
+ <div class="menu">
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?php foreach ( $this->data['action_urls'] as $link ) { ?>
+ <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
+ <?php } ?>
+ </ul>
+ </div>
+</div>
+<?php
+ break;
+ case 'PERSONAL':
+?>
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label">
+ <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php
+ $personalTools = $this->getPersonalTools();
+ foreach ( $personalTools as $key => $item ) {
+ echo $this->makeListItem( $key, $item );
+ }
+?>
+ </ul>
+</div>
+<?php
+ break;
+ case 'SEARCH':
+?>
+<div id="p-search" role="search">
+ <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <?php if ( $wgVectorUseSimpleSearch ) { ?>
+ <div id="simpleSearch">
+ <?php } else { ?>
+ <div>
+ <?php } ?>
+ <?php
+ echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+ echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+ // We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be
+ // visible and actionable at a time (they are overlaid on top of each other in CSS).
+ // * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), which
+ // is desirable when they are unable to show search suggestions (either due to being broken
+ // or having JavaScript turned off).
+ // * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes
+ // the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go'
+ // button and cause it to be used.
+ echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' ) );
+ echo $this->makeSearchButton( 'go', array( 'id' => 'searchButton', 'class' => 'searchButton' ) );
+ ?>
+ </div>
+ </form>
+</div>
+<?php
+
+ break;
+ }
+ }
+ }
+}
diff --git a/cologneblue/print.css b/cologneblue/print.css
new file mode 100644
index 0000000..d4b0551
--- /dev/null
+++ b/cologneblue/print.css
@@ -0,0 +1,6 @@
+#sitetitle,
+#sitesub,
+#titlelinks,
+#footer-navigation {
+ display: none;
+}
diff --git a/cologneblue/screen.css b/cologneblue/screen.css
new file mode 100644
index 0000000..ef9cf8f
--- /dev/null
+++ b/cologneblue/screen.css
@@ -0,0 +1,277 @@
+body {
+ margin: 0;
+ padding: 0;
+ color: black;
+ font-family: serif;
+}
+
+#specialform {
+ display: inline;
+}
+
+#content {
+ top: 0;
+ margin: 0;
+ padding: 0;
+}
+
+#mw-data-after-content {
+ font-family: Verdana, Arial, sans-serif;
+ color: black;
+ font-size: 8pt;
+}
+
+#powersearch {
+ background: #DDEEFF;
+ border-style: solid;
+ border-width: 1px;
+ padding: 2px;
+}
+
+#quickbar {
+ width: 140px;
+ top: 18ex;
+ padding: 2px;
+ visibility: visible;
+ z-index: 99;
+}
+
+#article, #article td, #article th, #article p {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ color: black;
+}
+
+#article p {
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-top: 1ex;
+ margin-bottom: 0;
+}
+
+p, pre, .mw-code, td, th, li, dd, dt {
+ line-height: 12pt;
+}
+
+textarea {
+ overflow: auto;
+ width: 100%;
+ display: block;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#footer {
+ margin-right: 2%;
+ margin-top: 1em;
+ padding: 4px;
+ font-family: verdana, arial, sans-serif;
+ font-size: 10pt;
+ text-align: center;
+}
+
+#footer form {
+ display: inline;
+}
+
+#cb-ca-edit {
+ font-weight: bold;
+}
+
+#pagestats {
+ font-family: Verdana, Arial, sans-serif;
+ color: black;
+ font-size: 9pt;
+}
+
+
+
+#quickbar {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 8pt;
+ font-weight: bold;
+ line-height: 9.5pt;
+ text-decoration: none;
+ color: black;
+ padding: 0;
+ margin-top: 0;
+}
+
+#quickbar a {
+ color: #446688;
+}
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+#quickbar h3 {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 10pt;
+ font-weight: bold;
+ line-height: 12pt;
+ text-decoration: none;
+ color: #666666;
+ padding: 0;
+ margin-bottom: 2px;
+ margin-top: 6px;
+}
+
+#quickbar form {
+ padding: 0;
+ margin-top: 0;
+}
+
+#quickbar .portlet ul,
+#quickbar .portlet li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ line-height: inherit;
+}
+
+div.after-portlet {
+ display: inline;
+ padding-left: .5em;
+}
+
+h1 {
+ color: #666666;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 180%;
+ line-height: 21pt;
+}
+
+h1#firstHeading {
+ padding-bottom: 0;
+ margin-bottom: 0;
+}
+
+#article p.subtitle, #article p.subpages, #article p.tagline {
+ color: #666666;
+ font-size: 11pt;
+ font-weight: bold;
+ padding-top: 0;
+ margin-top: 0;
+ padding-bottom: 1ex;
+}
+
+a {
+ color: #223366;
+}
+
+a.external {
+ color: #336644;
+}
+
+a:visited {
+ color: #8D0749;
+}
+
+a.printable {
+ text-decoration: underline;
+}
+
+a.stub, #quickbar a.stub {
+ color: #772233;
+ text-decoration: none;
+}
+
+a.new, #quickbar span.new a, #footer span.new a {
+ color: #CC2200;
+}
+
+h2, h3, h4, h5, h6 {
+ margin-bottom: 0;
+}
+
+small {
+ font-size: 75%;
+}
+
+input.mw-searchInput {
+ width: 106px;
+}
+
+/* Directionality-specific styles */
+#quickbar { position: absolute; left: 4px; }
+#article { margin-left: 148px; margin-right: 4px; }
+#footer { margin-left: 152px; }
+
+
+#sitetitle, #sitesub, #toplinks, #linkcollection {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+#sitetitle, #toplinks {
+ color: white;
+ text-transform: uppercase;
+ height: 32pt;
+}
+#sitetitle {
+ padding-left: 8px;
+ font-family: Times, serif;
+ font-weight: normal;
+ font-size: 32pt;
+ line-height: 32pt;
+ background-color: #6688AA;
+}
+#sitetitle a, #toplinks a {
+ color: white;
+ text-decoration: none;
+}
+/* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
+#sitetitle a {
+ position: relative;
+ z-index: 10
+}
+
+#toplinks {
+ font-family: Verdana, Arial, sans-serif;
+ position: absolute;
+ top: 0;
+ right: 8px;
+ width: 100%;
+ font-size: 8pt;
+}
+#toplinks a {
+ font-size: 10pt;
+}
+#toplinks p {
+ position: absolute;
+ right: 0;
+ margin: 0;
+ width: 100%;
+ text-align: right;
+}
+#toplinks #syslinks {
+ bottom: 0;
+}
+#toplinks #variantlinks {
+ bottom: 12pt;
+}
+
+#sitesub {
+ float: left;
+ margin-left: 8px;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 9pt;
+ font-weight: bold;
+ color: black;
+}
+
+#linkcollection {
+ margin-top: 0.5em;
+ font-size: small;
+ margin-right: 8px;
+ text-align: right;
+ padding-left: 140px;
+}
+/* Override text justification (user preference), see bug 31990 */
+#linkcollection * {
+ text-align: right;
+}
diff --git a/common/IEFixes.js b/common/IEFixes.js
new file mode 100644
index 0000000..545acad
--- /dev/null
+++ b/common/IEFixes.js
@@ -0,0 +1,121 @@
+/**
+ * IE fixes javascript loaded by wikibits.js for IE <= 6.0
+ */
+/*global isMSIE55:true, doneIETransform:true, doneIEAlphaFix:true */
+/*global hookit:true, fixalpha:true */
+( function ( mw, $ ) {
+
+var expandedURLs, hasClass;
+
+// Also returns true for IE6, 7, 8, 9 and 10. createPopup is removed in IE11.
+// Good thing this is only loaded for IE <= 6 by wikibits.
+// Might as well set it to true.
+isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
+doneIETransform = false;
+doneIEAlphaFix = false;
+
+hookit = function () {
+ if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
+ doneIETransform = true;
+ fixalpha();
+ }
+};
+
+if ( document.attachEvent ) {
+ document.attachEvent( 'onreadystatechange', hookit );
+}
+
+// png alpha transparency fixes
+fixalpha = function ( logoId ) {
+ // bg
+ if ( isMSIE55 && !doneIEAlphaFix ) {
+ var bg, imageUrl, linkFix, logoa, logospan, plogo;
+ plogo = document.getElementById( logoId || 'p-logo' );
+ if ( !plogo ) {
+ return;
+ }
+
+ logoa = plogo.getElementsByTagName('a')[0];
+ if ( !logoa ) {
+ return;
+ }
+
+ bg = logoa.currentStyle.backgroundImage;
+ imageUrl = bg.substring( 5, bg.length - 2 );
+
+ doneIEAlphaFix = true;
+
+ if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() === '.png' ) {
+ logospan = logoa.appendChild( document.createElement( 'span' ) );
+
+ logoa.style.backgroundImage = 'none';
+ logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')';
+ logospan.style.height = '100%';
+ logospan.style.position = 'absolute';
+ logospan.style.width = logoa.currentStyle.width;
+ logospan.style.cursor = 'hand';
+ // Center image with hack for IE5.5
+ if ( document.documentElement.dir === 'rtl' ) {
+ logospan.style.right = '50%';
+ logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' );
+ } else {
+ logospan.style.left = '50%';
+ logospan.style.setExpression( 'marginLeft', '"-" + (this.offsetWidth / 2) + "px"' );
+ }
+ logospan.style.top = '50%';
+ logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' );
+
+ linkFix = logoa.appendChild( logoa.cloneNode() );
+ linkFix.style.position = 'absolute';
+ linkFix.style.height = '100%';
+ linkFix.style.width = '100%';
+ }
+ }
+};
+
+if ( isMSIE55 ) {
+ // ondomready
+ $( fixalpha );
+}
+
+// Expand links for printing
+hasClass = function ( classText, classWanted ) {
+ var i = 0, classArr = classText.split(/\s/);
+ for ( i = 0; i < classArr.length; i++ ) {
+ if ( classArr[i].toLowerCase() === classWanted.toLowerCase() ) {
+ return true;
+ }
+ }
+ return false;
+};
+
+window.onbeforeprint = function () {
+ var allLinks, contentEl, expandedLink, expandedText, i;
+
+ expandedURLs = [];
+ contentEl = document.getElementById( 'content' );
+
+ if ( contentEl ) {
+ allLinks = contentEl.getElementsByTagName( 'a' );
+
+ for ( i = 0; i < allLinks.length; i++ ) {
+ if ( hasClass( allLinks[i].className, 'external' ) && !hasClass( allLinks[i].className, 'free' ) ) {
+ expandedLink = document.createElement( 'span' );
+ expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
+ expandedLink.appendChild( expandedText );
+ allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling );
+ expandedURLs[i] = expandedLink;
+ }
+ }
+ }
+};
+
+window.onafterprint = function () {
+ for ( var i = 0; i < expandedURLs.length; i++ ) {
+ if ( expandedURLs[i] ) {
+ expandedURLs[i].removeNode( true );
+ }
+ }
+};
+
+}( mediaWiki, jQuery ) );
diff --git a/common/ajax.js b/common/ajax.js
new file mode 100644
index 0000000..ab0c793
--- /dev/null
+++ b/common/ajax.js
@@ -0,0 +1,193 @@
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the 3-clause BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false */
+/*global alert */
+( function ( mw ) {
+
+/**
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
+ * it is injected.
+ */
+function debug( text ) {
+ if ( !window.sajax_debug_mode ) {
+ return false;
+ }
+
+ var e = document.getElementById( 'sajax_debug' );
+
+ if ( !e ) {
+ e = document.createElement( 'p' );
+ e.className = 'sajax_debug';
+ e.id = 'sajax_debug';
+
+ var b = document.getElementsByTagName( 'body' )[0];
+
+ if ( b.firstChild ) {
+ b.insertBefore( e, b.firstChild );
+ } else {
+ b.appendChild( e );
+ }
+ }
+
+ var m = document.createElement( 'div' );
+ m.appendChild( document.createTextNode( text ) );
+
+ e.appendChild( m );
+
+ return true;
+}
+
+/**
+ * Compatibility wrapper for creating a new XMLHttpRequest object.
+ */
+function createXhr() {
+ debug( 'sajax_init_object() called..' );
+ var a;
+ try {
+ // Try the new style before ActiveX so we don't
+ // unnecessarily trigger warnings in IE 7 when
+ // set to prompt about ActiveX usage
+ a = new XMLHttpRequest();
+ } catch ( xhrE ) {
+ try {
+ a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+ } catch ( msXmlE ) {
+ try {
+ a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+ } catch ( msXhrE ) {
+ a = null;
+ }
+ }
+ }
+ if ( !a ) {
+ debug( 'Could not create connection object.' );
+ }
+
+ return a;
+}
+
+/**
+ * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
+ * func_name - the name of the function to call. Must be registered in $wgAjaxExportList
+ * args - an array of arguments to that function
+ * target - the target that will handle the result of the call. If this is a function,
+ * if will be called with the XMLHttpRequest as a parameter; if it's an input
+ * element, its value will be set to the resultText; if it's another type of
+ * element, its innerHTML will be set to the resultText.
+ *
+ * Example:
+ * sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
+ *
+ * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
+ * (1, 2, 3) as the parameter list, and will show the result in the element
+ * with id = showFoo
+ */
+function doAjaxRequest( func_name, args, target ) {
+ var i, x, uri, post_data;
+ uri = mw.util.wikiScript() + '?action=ajax';
+ if ( window.sajax_request_type === 'GET' ) {
+ if ( uri.indexOf( '?' ) === -1 ) {
+ uri = uri + '?rs=' + encodeURIComponent( func_name );
+ } else {
+ uri = uri + '&rs=' + encodeURIComponent( func_name );
+ }
+ for ( i = 0; i < args.length; i++ ) {
+ uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+ }
+ //uri = uri + '&rsrnd=' + new Date().getTime();
+ post_data = null;
+ } else {
+ post_data = 'rs=' + encodeURIComponent( func_name );
+ for ( i = 0; i < args.length; i++ ) {
+ post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+ }
+ }
+ x = createXhr();
+ if ( !x ) {
+ alert( 'AJAX not supported' );
+ return false;
+ }
+
+ try {
+ x.open( window.sajax_request_type, uri, true );
+ } catch ( e ) {
+ if ( location.hostname === 'localhost' ) {
+ alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
+ }
+ throw e;
+ }
+ if ( window.sajax_request_type === 'POST' ) {
+ x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
+ x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
+ }
+ x.setRequestHeader( 'Pragma', 'cache=yes' );
+ x.setRequestHeader( 'Cache-Control', 'no-transform' );
+ x.onreadystatechange = function () {
+ if ( x.readyState !== 4 ) {
+ return;
+ }
+
+ debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+
+ //if ( x.status != 200 )
+ // alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
+ //else
+
+ if ( typeof target === 'function' ) {
+ target( x );
+ } else if ( typeof target === 'object' ) {
+ if ( target.tagName === 'INPUT' ) {
+ if ( x.status === 200 ) {
+ target.value = x.responseText;
+ }
+ //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
+ } else {
+ if ( x.status === 200 ) {
+ target.innerHTML = x.responseText;
+ } else {
+ target.innerHTML = '<div class="error">Error: ' + x.status +
+ ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+ }
+ }
+ } else {
+ alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
+ }
+ };
+
+ debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+ x.send( post_data );
+ debug( func_name + ' waiting..' );
+
+ return true;
+}
+
+/**
+ * @return {boolean} Whether the browser supports AJAX
+ */
+function wfSupportsAjax() {
+ var request = createXhr(),
+ supportsAjax = request ? true : false;
+
+ request = undefined;
+ return supportsAjax;
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
diff --git a/common/commonContent.css b/common/commonContent.css
new file mode 100644
index 0000000..41d20fb
--- /dev/null
+++ b/common/commonContent.css
@@ -0,0 +1,151 @@
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
+
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+
+/**
+ * We want to display the ToC element with intrinsic width in block mode. The fit-content
+ * value for width is however not supported by large groups of browsers.
+ *
+ * We use display:table. Even though it should only contain other table-* display
+ * elements, there are no known problems with using this.
+ *
+ * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * using inline-block mode, which features at least intrinsic width, but won't clear preceding
+ * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
+ * this is an acceptable sacrifice.
+ */
+#toc,
+.toc {
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earlier */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
+}
+
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+ padding: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+
+/* Warning */
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+
+/* Images */
+/* @noflip */div.floatright, table.floatright {
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+/* @noflip */div.floatleft, table.floatleft {
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ width: auto;
+ background-color: transparent;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ border: none !important;
+ background: none !important;
+ margin-left: 3px;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+/* @noflip */div.tright {
+ margin: .5em 0 1.3em 1.4em;
+}
+/* @noflip */div.tleft {
+ margin: .5em 1.4em 1.3em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
diff --git a/common/commonElements.css b/common/commonElements.css
new file mode 100644
index 0000000..ad7942a
--- /dev/null
+++ b/common/commonElements.css
@@ -0,0 +1,235 @@
+/**
+ * MediaWiki style sheet for general styles on basic content elements
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
+ */
+
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+a:active {
+ color: #faa700;
+}
+a:hover, a:focus {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+/* Interwiki Styling */
+.mw-body a.extiw,
+.mw-body a.extiw:active {
+ color: #36b;
+}
+.mw-body a.extiw:visited {
+ color: #636;
+}
+.mw-body a.extiw:active {
+ color: #b63;
+}
+
+/* External links */
+.mw-body a.external {
+ color: #36b;
+}
+.mw-body a.external:visited {
+ color: #636; /* bug 3112 */
+}
+.mw-body a.external:active {
+ color: #b63;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ overflow: hidden;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+}
+h1 {
+ font-size: 188%;
+}
+h2 {
+ font-size: 150%;
+}
+h3,
+h4,
+h5,
+h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 {
+ font-size: 132%;
+}
+h4 {
+ font-size: 116%;
+}
+h5 {
+ font-size: 108%;
+}
+h6 {
+ font-size: 100%;
+}
+
+/* Some space under the headers in the content area */
+h1,
+h2 {
+ margin-bottom: .6em;
+}
+h3,
+h4,
+h5 {
+ margin-bottom: .3em;
+}
+
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+p img {
+ margin: 0;
+}
+
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.6em;
+ padding: 0;
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-left: 1.6em;
+ margin-bottom: .1em;
+}
+
+/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
+ pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
+q {
+ *font-style: italic;
+}
+
+pre, code, tt, kbd, samp, .mw-code {
+ /*
+ * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
+ * Specifying any valid, second value will trigger correct behavior without forcing a different font.
+ */
+ font-family: monospace, Courier;
+}
+code {
+ background-color: #f9f9f9;
+}
+pre, .mw-code {
+ padding: 1em;
+ border: 1px solid #ddd;
+ color: black;
+ background-color: #f9f9f9;
+}
+
+/* Tables */
+table {
+ font-size: 100%;
+}
+
+/* Forms */
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+fieldset.nested {
+ margin: 0 0 0.5em 0;
+ padding: 0 0.5em 0.5em;
+}
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+textarea {
+ width: 100%;
+ padding: .1em;
+ display: block;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+select {
+ vertical-align: top;
+}
+
+/* Emulate Center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* Small for tables and similar */
+.small {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+
diff --git a/common/commonInterface.css b/common/commonInterface.css
new file mode 100644
index 0000000..7eca070
--- /dev/null
+++ b/common/commonInterface.css
@@ -0,0 +1,68 @@
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
+
+/* Categories */
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ position: relative;
+ text-align: center;
+ margin: 0;
+}
+#localNotice {
+ margin-bottom: 0.9em;
+}
+
+/* First h1 */
+.firstHeading,
+#firstHeading {
+ margin-bottom: .1em;
+ /* These two rules hack around bug 2013 (fix for more limited bug 11325).
+ * When bug 2013 is fixed properly, they should be removed. */
+ line-height: 1.2em;
+ padding-bottom: 0;
+}
+
+/* Sub-navigation */
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
+ margin-top: -1.4em;
+ margin-bottom: 1.4em
+}
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 0 1.4em 1em;
+ color: #545454;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+
diff --git a/common/commonPrint.css b/common/commonPrint.css
new file mode 100644
index 0000000..65f3fbe
--- /dev/null
+++ b/common/commonPrint.css
@@ -0,0 +1,401 @@
+/**
+ * MediaWiki Print style sheet for CSS2-capable browsers.
+ * Copyright Gabriel Wicke, http://www.aulinx.de/
+ *
+ * Derived from the plone (http://plone.org/) styles
+ * Copyright Alexander Limi
+ */
+
+/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
+a.stub,
+a.new {
+ color: #ba0000;
+ text-decoration: none;
+}
+
+#toc {
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+ /* IE7 and earlier */
+ zoom: 1;
+ *display: inline;
+}
+
+/* images */
+div.floatright {
+ float: right;
+ clear: right;
+ position: relative;
+ margin: 0.5em 0 0.8em 1.4em;
+}
+div.floatright p {
+ font-style: italic;
+}
+div.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0.5em 1.4em 0.8em 0;
+}
+div.floatleft p {
+ font-style: italic;
+}
+div.center {
+ text-align: center;
+}
+
+/* thumbnails */
+div.thumb {
+ border: none;
+ width: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.8em;
+ background-color: transparent;
+}
+div.thumbinner {
+ border:1px solid #cccccc;
+ padding: 3px !important;
+ background-color: White;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #cccccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+
+div.magnify {
+ display: none;
+}
+/* @noflip */
+div.tright {
+ float: right;
+ clear: right;
+ margin: 0.5em 0 0.8em 1.4em;
+}
+/* @noflip */
+div.tleft {
+ float: left;
+ clear: left;
+ margin: 0.5em 1.4em 0.8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+
+/* table standards */
+table.rimage {
+ float: right;
+ width: 1pt;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+body {
+ background: white;
+ color: black;
+ margin: 0;
+ padding: 0;
+}
+
+.noprint,
+div#jump-to-nav,
+.mw-jump,
+div.top,
+div#column-one,
+#colophon,
+.mw-editsection,
+.mw-editsection-like,
+.toctoggle,
+.tochidden,
+div#f-poweredbyico,
+div#f-copyrightico,
+li#viewcount,
+li#about,
+li#disclaimer,
+li#mobileview,
+li#privacy,
+#footer-places,
+.mw-hidden-catlinks,
+tr.mw-metadata-show-hide-extended,
+span.mw-filepage-other-resolutions,
+#filetoc,
+.usermessage,
+.patrollink,
+#mw-navigation {
+ /* Hides all the elements irrelevant for printing */
+ display: none;
+}
+
+ul {
+ list-style-type: square;
+}
+
+#content {
+ background: none;
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ direction: ltr;
+}
+#footer {
+ background : white;
+ color : black;
+ margin-top: 1em;
+ border-top: 1px solid #AAA;
+ direction: ltr;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+}
+
+dt {
+ font-weight: bold;
+}
+
+p {
+ margin: 1em 0;
+ line-height: 1.2em;
+}
+
+pre, .mw-code {
+ border: 1pt dashed black;
+ white-space: pre;
+ font-size: 8pt;
+ overflow: auto;
+ padding: 1em 0;
+ background: white;
+ color: black;
+}
+
+table.listing,
+table.listing td {
+ border: 1pt solid black;
+ border-collapse: collapse;
+}
+
+a {
+ color: black !important;
+ background: none !important;
+ padding: 0 !important;
+}
+
+a:link, a:visited {
+ color: #520;
+ background: transparent;
+ text-decoration: underline;
+}
+
+#content a.external.text:after,
+#content a.external.autonumber:after {
+ /* Expand URLs for printing */
+ content: " (" attr(href) ")";
+}
+
+#globalWrapper {
+ width: 100% !important;
+ min-width: 0 !important;
+}
+
+#content {
+ background: white;
+ color: black;
+}
+
+#column-content {
+ margin: 0 !important;
+}
+
+#column-content #content {
+ padding: 1em;
+ margin: 0 !important;
+}
+
+/* MSIE/Win doesn't understand 'inherit' */
+a,
+a.external,
+a.new,
+a.stub {
+ color: black !important;
+ text-decoration: none !important;
+}
+
+/* Continue ... */
+a,
+a.external,
+a.new,
+a.stub {
+ color: inherit !important;
+ text-decoration: inherit !important;
+}
+
+img {
+ border: none;
+ vertical-align: middle;
+}
+
+/* math */
+span.texhtml {
+ font-family: serif;
+}
+
+#siteNotice {
+ display: none;
+}
+
+/* Galleries (see shared.css for more info) */
+li.gallerybox {
+ vertical-align: top;
+ display: -moz-inline-box;
+ display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+ zoom: 1;
+ *display: inline;
+}
+
+ul.gallery {
+ margin: 2px;
+ padding: 2px;
+ display: block;
+}
+
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+ word-wrap: break-word;
+}
+
+/**
+ * Diff rendering
+ */
+table.diff {
+ background: white;
+}
+td.diff-otitle {
+ background: #ffffff;
+}
+td.diff-ntitle {
+ background: #ffffff;
+}
+td.diff-addedline {
+ background: #ccffcc;
+ font-size: smaller;
+ border: solid 2px black;
+}
+td.diff-deletedline {
+ background: #ffffaa;
+ font-size: smaller;
+ border: dotted 2px black;
+}
+td.diff-context {
+ background: #eeeeee;
+ font-size: smaller;
+}
+.diffchange {
+ color: silver;
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+/**
+ * Table rendering
+ * As on shared.css but with white background.
+ */
+table.wikitable,
+table.mw_metadata {
+ margin: 1em 0;
+ border: 1px #aaa solid;
+ background: white;
+ border-collapse: collapse;
+}
+table.wikitable > tr > th, table.wikitable > tr > td,
+table.wikitable > * > tr > th, table.wikitable > * > tr > td,
+.mw_metadata th, .mw_metadata td {
+ border: 1px #aaa solid;
+ padding: 0.2em;
+}
+table.wikitable > tr > th,
+table.wikitable > * > tr > th,
+.mw_metadata th {
+ text-align: center;
+ background: white;
+ font-weight: bold;
+}
+table.wikitable > caption,
+.mw_metadata caption {
+ font-weight: bold;
+}
+
+a.sortheader {
+ margin: 0 0.3em;
+}
+
+/* Some pagination options */
+.wikitable, .thumb, img {
+ page-break-inside: avoid;
+}
+h2, h3, h4, h5, h6 {
+ page-break-after: avoid;
+}
+p {
+ widows: 3;
+ orphans: 3;
+}
+
+/**
+ * Categories
+ */
+.catlinks ul {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ list-style-type: none;
+ list-style-image: none;
+ vertical-align: middle !ie;
+}
+
+.catlinks li {
+ display: inline-block;
+ line-height: 1.15em;
+ padding: 0 .4em;
+ border-left: 1px solid #AAA;
+ margin: 0.1em 0;
+ zoom: 1;
+ display: inline !ie;
+}
+
+.catlinks li:first-child {
+ padding-left: .2em;
+ border-left: none;
+}
diff --git a/common/config-cc.css b/common/config-cc.css
new file mode 100644
index 0000000..d81218e
--- /dev/null
+++ b/common/config-cc.css
@@ -0,0 +1,57 @@
+/**
+ * Copy of CC standard stylesheet, plus tweaks for iframe usage
+ */
+
+body {
+ margin: 0;
+ background: #eee;
+ font-family: Verdana;
+ color: #333;
+}
+
+#main {
+ border: 1px solid #D0D0D0;
+ background: #fff;
+ margin: 0.5em;
+}
+
+/**
+ * Looks like you have to specify the width of #menu
+ * or IE5 Mac stretches it all the way across the div, and
+ * Opera streches it half way.
+ */
+
+#main #menu {
+ border-left: 1px dotted #ccc;
+ float: right;
+ width: 230px;
+ background: white;
+ margin: 0 0 10px 10px;
+}
+
+td, h3, p, h1, pre {
+ margin: 0 20px 20px 20px;
+ font-size: 11px;
+ line-height: 140%;
+}
+
+.header {
+ padding-left: 10px;
+ padding-top: 10px;
+}
+
+.nav {
+ padding-left: 10px;
+ padding-bottom: 10px;
+ font-size: 11px;
+ margin-bottom: 16px;
+}
+
+#menu p {
+ font-size: 11px;
+}
+
+.dent {
+ margin-left: 64px;
+}
+
diff --git a/common/config.css b/common/config.css
new file mode 100644
index 0000000..d646273
--- /dev/null
+++ b/common/config.css
@@ -0,0 +1,143 @@
+.env-check {
+ font-size: 90%;
+ margin: 1em 0 1em 2.5em;
+}
+
+.config-section {
+ margin-top: 2em;
+}
+.config-block {
+ margin-top: 2em;
+ display: block;
+
+}
+.config-block-label {
+ display: block;
+ margin-bottom: .2em;
+}
+.config-block-label label, .config-label {
+ font-weight: bold;
+ padding-right: .5em;
+ padding-top: .2em;
+}
+.config-block-elements {
+ margin-left: 2em;
+}
+.config-block-elements li {
+ list-style: none;
+}
+.config-input {
+ clear: left;
+ zoom: 100%; /* IE hack */
+}
+
+.config-page-wrapper {
+ padding: 0.5em;
+}
+
+.config-page-list {
+ float: right;
+ width: 12em;
+ border: 1px solid #aaa;
+ background: #fff;
+ padding: 0.5em;
+ /* 3em left margin to leave space between the list and the page-content */
+ margin: 0.5em 0.5em 0.5em 3.5em;
+}
+
+.config-page {
+ padding: 0.5em 0.5em 0.5em 2em;
+ margin: 0.5em 0.5em 0.5em 0.5em;
+ background: #eee;
+}
+
+.config-submit {
+ clear: left;
+ text-align: center;
+ padding: 1em;
+}
+
+.config-submit input {
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+}
+
+.config-page-disabled {
+ color: #aaa;
+}
+
+.config-error-box {
+ border: 2px solid #f00;
+}
+
+.config-page-current {
+ font-weight: bold;
+}
+
+.config-message {
+ display: list-item;
+ line-height: 1.5em;
+ /* @embed */
+ list-style-image: url(images/bullet.gif);
+ list-style-type: square;
+}
+
+.config-input-text {
+ width: 20em;
+ margin-right: 1em;
+}
+
+.config-input-check {
+ margin-left: 10em;
+}
+
+.error {
+ color: red;
+ background-color: #fff;
+ font-weight: bold;
+ left: 1em;
+ font-size: 100%;
+}
+
+.config-settings-block {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+}
+
+.btn-install {
+ font-weight: bold;
+ font-size: 110%;
+ padding: .2em .3em;
+}
+
+.success-message {
+ font-weight: bold;
+ font-size: 110%;
+ color: green;
+}
+.success-box {
+ font-size: 130%;
+}
+
+.config-cc-wrapper {
+ clear: left;
+ /* If you change this height, also change it in WebInstaller_Options::submitCC() */
+ height: 54em;
+}
+
+.config-plainlink a {
+ background: none !important;
+ padding: 0 !important;
+}
+
+.config-download-link {
+ font-size: 1.8em;
+ margin-left: 2em;
+}
+
+#config-live-log {
+ overflow: hidden;
+ min-width: 20em;
+}
diff --git a/common/config.js b/common/config.js
new file mode 100644
index 0000000..2886e08
--- /dev/null
+++ b/common/config.js
@@ -0,0 +1,108 @@
+( function ( $ ) {
+ $( function () {
+ var $label, labelText;
+
+ function syncText() {
+ var value = $(this).val()
+ .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
+ .replace( /&/, '&amp;' )
+ .replace( /__+/g, '_' )
+ .replace( /^_+/, '' )
+ .replace( /_+$/, '' );
+ value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+ $label.text( labelText.replace( '$1', value ) );
+ }
+
+ // Set up the help system
+ $( '.mw-help-field-data' )
+ .hide()
+ .closest( '.mw-help-field-container' )
+ .find( '.mw-help-field-hint' )
+ .show()
+ .click( function () {
+ $(this)
+ .closest( '.mw-help-field-container' )
+ .find( '.mw-help-field-data' )
+ .slideToggle( 'fast' );
+ } );
+
+ // Show/hide code for DB-specific options
+ // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
+ $( '.dbRadio' ).each( function () {
+ $( document.getElementById( $(this).attr( 'rel' ) ) ).hide();
+ } );
+ $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show();
+ $( '.dbRadio' ).click( function () {
+ var $checked = $( '.dbRadio:checked' ),
+ $wrapper = $( document.getElementById( $checked.attr( 'rel' ) ) );
+ if ( $wrapper.is( ':hidden' ) ) {
+ $( '.dbWrapper' ).hide( 'slow' );
+ $wrapper.show( 'slow' );
+ }
+ } );
+
+ // Scroll to the bottom of upgrade log
+ $( '#config-live-log' ).children( 'textarea' ).each( function () {
+ this.scrollTop = this.scrollHeight;
+ } );
+
+ // Show/hide Creative Commons thingy
+ $( '.licenseRadio' ).click( function () {
+ var $wrapper = $( '#config-cc-wrapper' );
+ if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) {
+ $wrapper.show( 'slow' );
+ } else {
+ $wrapper.hide( 'slow' );
+ }
+ } );
+
+ // Show/hide random stuff (email, upload)
+ $( '.showHideRadio' ).click( function () {
+ var $wrapper = $( '#' + $(this).attr( 'rel' ) );
+ if ( $(this).is( ':checked' ) ) {
+ $wrapper.show( 'slow' );
+ } else {
+ $wrapper.hide( 'slow' );
+ }
+ } );
+ $( '.hideShowRadio' ).click( function () {
+ var $wrapper = $( '#' + $(this).attr( 'rel' ) );
+ if ( $(this).is( ':checked' ) ) {
+ $wrapper.hide( 'slow' );
+ } else {
+ $wrapper.show( 'slow' );
+ }
+ } );
+
+ // Hide "other" textboxes by default
+ // Should not be done in CSS for javascript disabled compatibility
+ $( '.enabledByOther' ).closest( '.config-block' ).hide();
+
+ // Enable/disable "other" textboxes
+ $( '.enableForOther' ).click( function () {
+ var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) );
+ // FIXME: Ugh, this is ugly
+ if ( $(this).val() === 'other' ) {
+ $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
+ } else {
+ $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
+ }
+ } );
+
+ // Synchronize radio button label for sitename with textbox
+ $label = $( 'label[for=config__NamespaceType_site-name]' );
+ labelText = $label.text();
+ $label.text( labelText.replace( '$1', '' ) );
+ $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
+
+ // Show/Hide memcached servers when needed
+ $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
+ var $memc = $( '#config-memcachewrapper' );
+ if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
+ $memc.show( 'slow' );
+ } else {
+ $memc.hide( 'slow' );
+ }
+ } );
+ } );
+}( jQuery ) );
diff --git a/common/feed.css b/common/feed.css
new file mode 100644
index 0000000..9439663
--- /dev/null
+++ b/common/feed.css
@@ -0,0 +1,95 @@
+/*
+Make RSS and Atom feeds at least semi-legible to folk who accidentally
+load them in a browser...
+
+Compatibility:
+* Mozilla is fine.
+* Safari 1.2: the RSS <link> text isn't shown
+* Opera 7.5 uses the style sheet instead of its native RSS mode.
+* IE/Mac 5.2: none of the :before content works; doesn't get the charset right and displays garbage for non-ASCII.
+* IE/Win 6.0: No background color, borders, font size, font weight, or :before content.
+
+*/
+
+/* RSS: */ rss, channel, title, link, description, language, generator, lastBuildDate, item, pubDate, author, comments, creator,
+/* Atom: */ feed, id, modified, tagline, entry, issued, created, updated, summary, comment {
+ display: block;
+}
+
+rss, feed {
+ background: white;
+ color: black;
+ margin: 1em;
+ font-family: "Verdana", "Tahoma", "Arial", "Helvetica", sans-serif;
+ line-height: 1.5em;
+ font-size: 76%;
+}
+
+rss:before {
+ content: "This RSS feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser.";
+}
+
+feed:before {
+ content: "This Atom feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser.";
+}
+rss:before, feed:before {
+ color: red;
+ text-align: center;
+ line-height: 2em;
+}
+
+channel>title,
+item>title,
+feed>title,
+entry>title {
+ font-weight: bold;
+ border-bottom: solid 1px #aaa;
+ margin-left: -0.5em;
+}
+channel>title, feed>title {
+ font-size: larger;
+}
+item>title, entry>title {
+ font-size: large;
+}
+item, entry {
+ margin-top: 1em;
+ margin-left: 2em;
+}
+
+item>description, entry>summary {
+ white-space: pre;
+ overflow: auto;
+ background: #f8f8ff;
+}
+
+pubDate:before { content: "Date: " }
+link:before { content: "Link: " }
+author:before, creator:before { content: "Author: " }
+description:before { content: "Description: " }
+id:before { content: "Id: " }
+
+generator:before { content: "Generator: " }
+language:before { content: "Language: " }
+lastBuildDate:before { content: "Updated: " }
+comments:before { content: "Comments page: " }
+
+tagline:before { content: "Tagline: " }
+issued:before { content: "Issued: " }
+created:before { content: "Created: " }
+modified:before { content: "Modified: " }
+updated:before { content: "Updated: " }
+summary:before { content: "Summary: " }
+comment:before { content: "Comment: " }
+
+pubDate:before, link:before, author:before, description:before,
+language:before, generator:before, lastBuildDate:before, comments:before,
+tagline:before, issued:before, created:before, modified:before,
+summary:before, comment:before, creator:before, id:before, updated:before {
+ color: #224;
+ font-weight: bold;
+}
+
+feed link:after {
+ content: attr(href);
+}
diff --git a/common/images/Arr_.png b/common/images/Arr_.png
new file mode 100644
index 0000000..bc67a4b
--- /dev/null
+++ b/common/images/Arr_.png
Binary files differ
diff --git a/common/images/Arr_d.png b/common/images/Arr_d.png
new file mode 100644
index 0000000..58a9fc6
--- /dev/null
+++ b/common/images/Arr_d.png
Binary files differ
diff --git a/common/images/Arr_l.png b/common/images/Arr_l.png
new file mode 100644
index 0000000..2246254
--- /dev/null
+++ b/common/images/Arr_l.png
Binary files differ
diff --git a/common/images/Arr_r.png b/common/images/Arr_r.png
new file mode 100644
index 0000000..467a555
--- /dev/null
+++ b/common/images/Arr_r.png
Binary files differ
diff --git a/common/images/Arr_u.png b/common/images/Arr_u.png
new file mode 100644
index 0000000..1aa543a
--- /dev/null
+++ b/common/images/Arr_u.png
Binary files differ
diff --git a/common/images/Checker-16x16.png b/common/images/Checker-16x16.png
new file mode 100644
index 0000000..3e9e3d0
--- /dev/null
+++ b/common/images/Checker-16x16.png
Binary files differ
diff --git a/common/images/Zoom_sans.gif b/common/images/Zoom_sans.gif
new file mode 100644
index 0000000..56a49de
--- /dev/null
+++ b/common/images/Zoom_sans.gif
Binary files differ
diff --git a/common/images/add.png b/common/images/add.png
new file mode 100644
index 0000000..3497423
--- /dev/null
+++ b/common/images/add.png
Binary files differ
diff --git a/common/images/ajax-loader.gif b/common/images/ajax-loader.gif
new file mode 100644
index 0000000..72203fd
--- /dev/null
+++ b/common/images/ajax-loader.gif
Binary files differ
diff --git a/common/images/ar/button_bold.png b/common/images/ar/button_bold.png
new file mode 100644
index 0000000..e524f6c
--- /dev/null
+++ b/common/images/ar/button_bold.png
Binary files differ
diff --git a/common/images/ar/button_headline.png b/common/images/ar/button_headline.png
new file mode 100644
index 0000000..398e561
--- /dev/null
+++ b/common/images/ar/button_headline.png
Binary files differ
diff --git a/common/images/ar/button_italic.png b/common/images/ar/button_italic.png
new file mode 100644
index 0000000..6ec73e9
--- /dev/null
+++ b/common/images/ar/button_italic.png
Binary files differ
diff --git a/common/images/ar/button_link.png b/common/images/ar/button_link.png
new file mode 100644
index 0000000..c9c63f6
--- /dev/null
+++ b/common/images/ar/button_link.png
Binary files differ
diff --git a/common/images/ar/button_nowiki.png b/common/images/ar/button_nowiki.png
new file mode 100644
index 0000000..743ea61
--- /dev/null
+++ b/common/images/ar/button_nowiki.png
Binary files differ
diff --git a/common/images/arrow_disabled_first_25.png b/common/images/arrow_disabled_first_25.png
new file mode 100644
index 0000000..78a493e
--- /dev/null
+++ b/common/images/arrow_disabled_first_25.png
Binary files differ
diff --git a/common/images/arrow_disabled_last_25.png b/common/images/arrow_disabled_last_25.png
new file mode 100644
index 0000000..2a64fd0
--- /dev/null
+++ b/common/images/arrow_disabled_last_25.png
Binary files differ
diff --git a/common/images/arrow_disabled_left_25.png b/common/images/arrow_disabled_left_25.png
new file mode 100644
index 0000000..83df068
--- /dev/null
+++ b/common/images/arrow_disabled_left_25.png
Binary files differ
diff --git a/common/images/arrow_disabled_right_25.png b/common/images/arrow_disabled_right_25.png
new file mode 100644
index 0000000..aa4fbf8
--- /dev/null
+++ b/common/images/arrow_disabled_right_25.png
Binary files differ
diff --git a/common/images/arrow_first_25.png b/common/images/arrow_first_25.png
new file mode 100644
index 0000000..52b32a5
--- /dev/null
+++ b/common/images/arrow_first_25.png
Binary files differ
diff --git a/common/images/arrow_last_25.png b/common/images/arrow_last_25.png
new file mode 100644
index 0000000..caf5033
--- /dev/null
+++ b/common/images/arrow_last_25.png
Binary files differ
diff --git a/common/images/arrow_left_25.png b/common/images/arrow_left_25.png
new file mode 100644
index 0000000..f363bf6
--- /dev/null
+++ b/common/images/arrow_left_25.png
Binary files differ
diff --git a/common/images/arrow_right_25.png b/common/images/arrow_right_25.png
new file mode 100644
index 0000000..3f8fee3
--- /dev/null
+++ b/common/images/arrow_right_25.png
Binary files differ
diff --git a/common/images/be-tarask/button_bold.png b/common/images/be-tarask/button_bold.png
new file mode 100644
index 0000000..5c10cfe
--- /dev/null
+++ b/common/images/be-tarask/button_bold.png
Binary files differ
diff --git a/common/images/be-tarask/button_italic.png b/common/images/be-tarask/button_italic.png
new file mode 100644
index 0000000..72209d7
--- /dev/null
+++ b/common/images/be-tarask/button_italic.png
Binary files differ
diff --git a/common/images/be-tarask/button_link.png b/common/images/be-tarask/button_link.png
new file mode 100644
index 0000000..09c86fb
--- /dev/null
+++ b/common/images/be-tarask/button_link.png
Binary files differ
diff --git a/common/images/bullet.gif b/common/images/bullet.gif
new file mode 100644
index 0000000..b43de48
--- /dev/null
+++ b/common/images/bullet.gif
Binary files differ
diff --git a/common/images/button_bold.png b/common/images/button_bold.png
new file mode 100644
index 0000000..75c3f10
--- /dev/null
+++ b/common/images/button_bold.png
Binary files differ
diff --git a/common/images/button_extlink.png b/common/images/button_extlink.png
new file mode 100644
index 0000000..458943c
--- /dev/null
+++ b/common/images/button_extlink.png
Binary files differ
diff --git a/common/images/button_headline.png b/common/images/button_headline.png
new file mode 100644
index 0000000..9cf751d
--- /dev/null
+++ b/common/images/button_headline.png
Binary files differ
diff --git a/common/images/button_hr.png b/common/images/button_hr.png
new file mode 100644
index 0000000..47e1ca4
--- /dev/null
+++ b/common/images/button_hr.png
Binary files differ
diff --git a/common/images/button_image.png b/common/images/button_image.png
new file mode 100644
index 0000000..6919296
--- /dev/null
+++ b/common/images/button_image.png
Binary files differ
diff --git a/common/images/button_italic.png b/common/images/button_italic.png
new file mode 100644
index 0000000..527fbd1
--- /dev/null
+++ b/common/images/button_italic.png
Binary files differ
diff --git a/common/images/button_link.png b/common/images/button_link.png
new file mode 100644
index 0000000..eb5634b
--- /dev/null
+++ b/common/images/button_link.png
Binary files differ
diff --git a/common/images/button_media.png b/common/images/button_media.png
new file mode 100644
index 0000000..4194ec1
--- /dev/null
+++ b/common/images/button_media.png
Binary files differ
diff --git a/common/images/button_nowiki.png b/common/images/button_nowiki.png
new file mode 100644
index 0000000..2ba818d
--- /dev/null
+++ b/common/images/button_nowiki.png
Binary files differ
diff --git a/common/images/button_sig.png b/common/images/button_sig.png
new file mode 100644
index 0000000..fe34b3f
--- /dev/null
+++ b/common/images/button_sig.png
Binary files differ
diff --git a/common/images/button_template.png b/common/images/button_template.png
new file mode 100644
index 0000000..94d9d0b
--- /dev/null
+++ b/common/images/button_template.png
Binary files differ
diff --git a/common/images/cc-0.png b/common/images/cc-0.png
new file mode 100644
index 0000000..9d3fe5f
--- /dev/null
+++ b/common/images/cc-0.png
Binary files differ
diff --git a/common/images/cc-by-nc-sa.png b/common/images/cc-by-nc-sa.png
new file mode 100644
index 0000000..0d24a71
--- /dev/null
+++ b/common/images/cc-by-nc-sa.png
Binary files differ
diff --git a/common/images/cc-by-sa.png b/common/images/cc-by-sa.png
new file mode 100644
index 0000000..518fb64
--- /dev/null
+++ b/common/images/cc-by-sa.png
Binary files differ
diff --git a/common/images/cc-by.png b/common/images/cc-by.png
new file mode 100644
index 0000000..9cca2f9
--- /dev/null
+++ b/common/images/cc-by.png
Binary files differ
diff --git a/common/images/closewindow.png b/common/images/closewindow.png
new file mode 100644
index 0000000..990702e
--- /dev/null
+++ b/common/images/closewindow.png
Binary files differ
diff --git a/common/images/closewindow19x19.png b/common/images/closewindow19x19.png
new file mode 100644
index 0000000..c96d9ff
--- /dev/null
+++ b/common/images/closewindow19x19.png
Binary files differ
diff --git a/common/images/critical-32.png b/common/images/critical-32.png
new file mode 100644
index 0000000..9b38e6a
--- /dev/null
+++ b/common/images/critical-32.png
Binary files differ
diff --git a/common/images/cyrl/LICENSE b/common/images/cyrl/LICENSE
new file mode 100644
index 0000000..bedcec6
--- /dev/null
+++ b/common/images/cyrl/LICENSE
@@ -0,0 +1,17 @@
+button_bold.png
+---------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_italic.png
+------------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png
+License: Public domain
+Author : Alexey Belomoev
+
+button_link.png
+-----------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png
+License: GPL
+Author : Saproj, Erik Möller
diff --git a/common/images/cyrl/button_bold.png b/common/images/cyrl/button_bold.png
new file mode 100644
index 0000000..eae30d9
--- /dev/null
+++ b/common/images/cyrl/button_bold.png
Binary files differ
diff --git a/common/images/cyrl/button_italic.png b/common/images/cyrl/button_italic.png
new file mode 100644
index 0000000..b958d22
--- /dev/null
+++ b/common/images/cyrl/button_italic.png
Binary files differ
diff --git a/common/images/cyrl/button_link.png b/common/images/cyrl/button_link.png
new file mode 100644
index 0000000..12ad373
--- /dev/null
+++ b/common/images/cyrl/button_link.png
Binary files differ
diff --git a/common/images/de/button_bold.png b/common/images/de/button_bold.png
new file mode 100644
index 0000000..367d5bc
--- /dev/null
+++ b/common/images/de/button_bold.png
Binary files differ
diff --git a/common/images/de/button_italic.png b/common/images/de/button_italic.png
new file mode 100644
index 0000000..fdd8c9f
--- /dev/null
+++ b/common/images/de/button_italic.png
Binary files differ
diff --git a/common/images/diffunderline.gif b/common/images/diffunderline.gif
new file mode 100644
index 0000000..e062c56
--- /dev/null
+++ b/common/images/diffunderline.gif
Binary files differ
diff --git a/common/images/download-32.png b/common/images/download-32.png
new file mode 100644
index 0000000..e5b8318
--- /dev/null
+++ b/common/images/download-32.png
Binary files differ
diff --git a/common/images/fa/button_bold.png b/common/images/fa/button_bold.png
new file mode 100644
index 0000000..c54d094
--- /dev/null
+++ b/common/images/fa/button_bold.png
Binary files differ
diff --git a/common/images/fa/button_headline.png b/common/images/fa/button_headline.png
new file mode 100644
index 0000000..9890d15
--- /dev/null
+++ b/common/images/fa/button_headline.png
Binary files differ
diff --git a/common/images/fa/button_italic.png b/common/images/fa/button_italic.png
new file mode 100644
index 0000000..33f91ed
--- /dev/null
+++ b/common/images/fa/button_italic.png
Binary files differ
diff --git a/common/images/fa/button_link.png b/common/images/fa/button_link.png
new file mode 100644
index 0000000..76b939e
--- /dev/null
+++ b/common/images/fa/button_link.png
Binary files differ
diff --git a/common/images/fa/button_nowiki.png b/common/images/fa/button_nowiki.png
new file mode 100644
index 0000000..743ea61
--- /dev/null
+++ b/common/images/fa/button_nowiki.png
Binary files differ
diff --git a/common/images/feed-icon.png b/common/images/feed-icon.png
new file mode 100644
index 0000000..00f49f6
--- /dev/null
+++ b/common/images/feed-icon.png
Binary files differ
diff --git a/common/images/feed-icon.svg b/common/images/feed-icon.svg
new file mode 100644
index 0000000..6e5f570
--- /dev/null
+++ b/common/images/feed-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg> \ No newline at end of file
diff --git a/common/images/gnu-fdl.png b/common/images/gnu-fdl.png
new file mode 100644
index 0000000..3feaf57
--- /dev/null
+++ b/common/images/gnu-fdl.png
Binary files differ
diff --git a/common/images/help-question-hover.gif b/common/images/help-question-hover.gif
new file mode 100644
index 0000000..515138d
--- /dev/null
+++ b/common/images/help-question-hover.gif
Binary files differ
diff --git a/common/images/help-question.gif b/common/images/help-question.gif
new file mode 100644
index 0000000..b4fc9c5
--- /dev/null
+++ b/common/images/help-question.gif
Binary files differ
diff --git a/common/images/icons/COPYING b/common/images/icons/COPYING
new file mode 100644
index 0000000..136530a
--- /dev/null
+++ b/common/images/icons/COPYING
@@ -0,0 +1,43 @@
+The icons used here are derived from the crystalsvg icons in the the
+pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15
+by Ævar Arnfjörð Bjarmason for use in MediaWiki.
+
+What follows is the contents of the LICENSE.crystalsvg file found in the pics/
+subdirectory of kdelibs-3.4.0:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+This copyright and license notice covers all CrystalSVG images.
+Note the license notice contains an add-on.
+********************************************************************************
+KDE Crystal theme icons.
+Copyright (C) 2002 and following years KDE Artists
+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,
+version 2.1 of the License.
+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
+ **** NOTE THIS ADD-ON ****
+The GNU Lesser General Public License or LGPL is written for software libraries
+in the first place. We expressly want the LGPL to be valid for this artwork
+library too.
+KDE Crystal theme icons is a special kind of software library, it is an
+artwork library, it's elements can be used in a Graphical User Interface, or
+GUI.
+Source code, for this library means:
+ - for vectors svg;
+ - for pixels, if applicable, the multi-layered formats xcf or psd, or
+otherwise png.
+The LGPL in some sections obliges you to make the files carry
+notices. With images this is in some cases impossible or hardly useful.
+With this library a notice is placed at a prominent place in the directory
+containing the elements. You may follow this practice.
+The exception in section 6 of the GNU Lesser General Public License covers
+the use of elements of this art library in a GUI.
+kde-artists [at] kde.org
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/common/images/icons/fileicon-c.png b/common/images/icons/fileicon-c.png
new file mode 100644
index 0000000..0d603b7
--- /dev/null
+++ b/common/images/icons/fileicon-c.png
Binary files differ
diff --git a/common/images/icons/fileicon-cpp.png b/common/images/icons/fileicon-cpp.png
new file mode 100644
index 0000000..123688f
--- /dev/null
+++ b/common/images/icons/fileicon-cpp.png
Binary files differ
diff --git a/common/images/icons/fileicon-deb.png b/common/images/icons/fileicon-deb.png
new file mode 100644
index 0000000..87ca3fa
--- /dev/null
+++ b/common/images/icons/fileicon-deb.png
Binary files differ
diff --git a/common/images/icons/fileicon-djvu.png b/common/images/icons/fileicon-djvu.png
new file mode 100644
index 0000000..1da2276
--- /dev/null
+++ b/common/images/icons/fileicon-djvu.png
Binary files differ
diff --git a/common/images/icons/fileicon-djvu.xcf b/common/images/icons/fileicon-djvu.xcf
new file mode 100644
index 0000000..8043dcd
--- /dev/null
+++ b/common/images/icons/fileicon-djvu.xcf
Binary files differ
diff --git a/common/images/icons/fileicon-dvi.png b/common/images/icons/fileicon-dvi.png
new file mode 100644
index 0000000..f37878d
--- /dev/null
+++ b/common/images/icons/fileicon-dvi.png
Binary files differ
diff --git a/common/images/icons/fileicon-exe.png b/common/images/icons/fileicon-exe.png
new file mode 100644
index 0000000..dc020eb
--- /dev/null
+++ b/common/images/icons/fileicon-exe.png
Binary files differ
diff --git a/common/images/icons/fileicon-h.png b/common/images/icons/fileicon-h.png
new file mode 100644
index 0000000..339bf02
--- /dev/null
+++ b/common/images/icons/fileicon-h.png
Binary files differ
diff --git a/common/images/icons/fileicon-html.png b/common/images/icons/fileicon-html.png
new file mode 100644
index 0000000..f28f8a2
--- /dev/null
+++ b/common/images/icons/fileicon-html.png
Binary files differ
diff --git a/common/images/icons/fileicon-iso.png b/common/images/icons/fileicon-iso.png
new file mode 100644
index 0000000..c73d229
--- /dev/null
+++ b/common/images/icons/fileicon-iso.png
Binary files differ
diff --git a/common/images/icons/fileicon-java.png b/common/images/icons/fileicon-java.png
new file mode 100644
index 0000000..a1b4f22
--- /dev/null
+++ b/common/images/icons/fileicon-java.png
Binary files differ
diff --git a/common/images/icons/fileicon-mid.png b/common/images/icons/fileicon-mid.png
new file mode 100644
index 0000000..ce2bebb
--- /dev/null
+++ b/common/images/icons/fileicon-mid.png
Binary files differ
diff --git a/common/images/icons/fileicon-mov.png b/common/images/icons/fileicon-mov.png
new file mode 100644
index 0000000..952de1f
--- /dev/null
+++ b/common/images/icons/fileicon-mov.png
Binary files differ
diff --git a/common/images/icons/fileicon-o.png b/common/images/icons/fileicon-o.png
new file mode 100644
index 0000000..f3523d9
--- /dev/null
+++ b/common/images/icons/fileicon-o.png
Binary files differ
diff --git a/common/images/icons/fileicon-ogg.png b/common/images/icons/fileicon-ogg.png
new file mode 100644
index 0000000..ef4d801
--- /dev/null
+++ b/common/images/icons/fileicon-ogg.png
Binary files differ
diff --git a/common/images/icons/fileicon-ogg.xcf b/common/images/icons/fileicon-ogg.xcf
new file mode 100644
index 0000000..a91024b
--- /dev/null
+++ b/common/images/icons/fileicon-ogg.xcf
Binary files differ
diff --git a/common/images/icons/fileicon-pdf.png b/common/images/icons/fileicon-pdf.png
new file mode 100644
index 0000000..8c8da92
--- /dev/null
+++ b/common/images/icons/fileicon-pdf.png
Binary files differ
diff --git a/common/images/icons/fileicon-ps.png b/common/images/icons/fileicon-ps.png
new file mode 100644
index 0000000..e872833
--- /dev/null
+++ b/common/images/icons/fileicon-ps.png
Binary files differ
diff --git a/common/images/icons/fileicon-psd.png b/common/images/icons/fileicon-psd.png
new file mode 100644
index 0000000..598f190
--- /dev/null
+++ b/common/images/icons/fileicon-psd.png
Binary files differ
diff --git a/common/images/icons/fileicon-rm.png b/common/images/icons/fileicon-rm.png
new file mode 100644
index 0000000..81dbe0b
--- /dev/null
+++ b/common/images/icons/fileicon-rm.png
Binary files differ
diff --git a/common/images/icons/fileicon-rpm.png b/common/images/icons/fileicon-rpm.png
new file mode 100644
index 0000000..1903aac
--- /dev/null
+++ b/common/images/icons/fileicon-rpm.png
Binary files differ
diff --git a/common/images/icons/fileicon-svg.png b/common/images/icons/fileicon-svg.png
new file mode 100644
index 0000000..b782113
--- /dev/null
+++ b/common/images/icons/fileicon-svg.png
Binary files differ
diff --git a/common/images/icons/fileicon-tar.png b/common/images/icons/fileicon-tar.png
new file mode 100644
index 0000000..e5fd1b7
--- /dev/null
+++ b/common/images/icons/fileicon-tar.png
Binary files differ
diff --git a/common/images/icons/fileicon-tex.png b/common/images/icons/fileicon-tex.png
new file mode 100644
index 0000000..a437284
--- /dev/null
+++ b/common/images/icons/fileicon-tex.png
Binary files differ
diff --git a/common/images/icons/fileicon-ttf.png b/common/images/icons/fileicon-ttf.png
new file mode 100644
index 0000000..1ed4e74
--- /dev/null
+++ b/common/images/icons/fileicon-ttf.png
Binary files differ
diff --git a/common/images/icons/fileicon-txt.png b/common/images/icons/fileicon-txt.png
new file mode 100644
index 0000000..9e988e7
--- /dev/null
+++ b/common/images/icons/fileicon-txt.png
Binary files differ
diff --git a/common/images/icons/fileicon.png b/common/images/icons/fileicon.png
new file mode 100644
index 0000000..59696a3
--- /dev/null
+++ b/common/images/icons/fileicon.png
Binary files differ
diff --git a/common/images/info-32.png b/common/images/info-32.png
new file mode 100644
index 0000000..ab09e1d
--- /dev/null
+++ b/common/images/info-32.png
Binary files differ
diff --git a/common/images/ksh/LICENSE b/common/images/ksh/LICENSE
new file mode 100644
index 0000000..ba56f97
--- /dev/null
+++ b/common/images/ksh/LICENSE
@@ -0,0 +1,7 @@
+
+button_S_italic.png
+-------------------
+Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png
+License: Public domain
+Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha
+
diff --git a/common/images/ksh/button_S_italic.png b/common/images/ksh/button_S_italic.png
new file mode 100644
index 0000000..15496c0
--- /dev/null
+++ b/common/images/ksh/button_S_italic.png
Binary files differ
diff --git a/common/images/link_icon.gif b/common/images/link_icon.gif
new file mode 100644
index 0000000..168c1a2
--- /dev/null
+++ b/common/images/link_icon.gif
Binary files differ
diff --git a/common/images/magnify-clip-rtl.png b/common/images/magnify-clip-rtl.png
new file mode 100644
index 0000000..ff85c07
--- /dev/null
+++ b/common/images/magnify-clip-rtl.png
Binary files differ
diff --git a/common/images/magnify-clip.png b/common/images/magnify-clip.png
new file mode 100644
index 0000000..00a9cee
--- /dev/null
+++ b/common/images/magnify-clip.png
Binary files differ
diff --git a/common/images/mediawiki.png b/common/images/mediawiki.png
new file mode 100644
index 0000000..8c42118
--- /dev/null
+++ b/common/images/mediawiki.png
Binary files differ
diff --git a/common/images/nextredirectltr.png b/common/images/nextredirectltr.png
new file mode 100644
index 0000000..cd657c3
--- /dev/null
+++ b/common/images/nextredirectltr.png
Binary files differ
diff --git a/common/images/nextredirectrtl.png b/common/images/nextredirectrtl.png
new file mode 100644
index 0000000..b788f33
--- /dev/null
+++ b/common/images/nextredirectrtl.png
Binary files differ
diff --git a/common/images/poweredby_mediawiki_88x31.png b/common/images/poweredby_mediawiki_88x31.png
new file mode 100644
index 0000000..30e1d2e
--- /dev/null
+++ b/common/images/poweredby_mediawiki_88x31.png
Binary files differ
diff --git a/common/images/public-domain.png b/common/images/public-domain.png
new file mode 100644
index 0000000..ebf0107
--- /dev/null
+++ b/common/images/public-domain.png
Binary files differ
diff --git a/common/images/question-small.png b/common/images/question-small.png
new file mode 100644
index 0000000..f7405d2
--- /dev/null
+++ b/common/images/question-small.png
Binary files differ
diff --git a/common/images/question.svg b/common/images/question.svg
new file mode 100644
index 0000000..98fbe8d
--- /dev/null
+++ b/common/images/question.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg> \ No newline at end of file
diff --git a/common/images/redirectltr.png b/common/images/redirectltr.png
new file mode 100644
index 0000000..695f2a1
--- /dev/null
+++ b/common/images/redirectltr.png
Binary files differ
diff --git a/common/images/redirectrtl.png b/common/images/redirectrtl.png
new file mode 100644
index 0000000..c954a2a
--- /dev/null
+++ b/common/images/redirectrtl.png
Binary files differ
diff --git a/common/images/remove.png b/common/images/remove.png
new file mode 100644
index 0000000..cd03d6d
--- /dev/null
+++ b/common/images/remove.png
Binary files differ
diff --git a/common/images/spinner.gif b/common/images/spinner.gif
new file mode 100644
index 0000000..6146be4
--- /dev/null
+++ b/common/images/spinner.gif
Binary files differ
diff --git a/common/images/tick-32.png b/common/images/tick-32.png
new file mode 100644
index 0000000..34cfa9c
--- /dev/null
+++ b/common/images/tick-32.png
Binary files differ
diff --git a/common/images/tipsy-arrow.gif b/common/images/tipsy-arrow.gif
new file mode 100644
index 0000000..9f1a15b
--- /dev/null
+++ b/common/images/tipsy-arrow.gif
Binary files differ
diff --git a/common/images/tooltip_icon.png b/common/images/tooltip_icon.png
new file mode 100644
index 0000000..ba5718a
--- /dev/null
+++ b/common/images/tooltip_icon.png
Binary files differ
diff --git a/common/images/warning-32.png b/common/images/warning-32.png
new file mode 100644
index 0000000..0400734
--- /dev/null
+++ b/common/images/warning-32.png
Binary files differ
diff --git a/common/images/wiki.png b/common/images/wiki.png
new file mode 100644
index 0000000..48595b0
--- /dev/null
+++ b/common/images/wiki.png
Binary files differ
diff --git a/common/oldshared.css b/common/oldshared.css
new file mode 100644
index 0000000..eea8b8e
--- /dev/null
+++ b/common/oldshared.css
@@ -0,0 +1,469 @@
+/**
+ * oldshared.css
+ * This file contains CSS settings common to Wikistandard, Nostalgia and
+ * CologneBlue, the old pre-Monobook skins
+ */
+
+/* For clarity, explicitly state some recommendations from
+ * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
+ */
+
+h1 { font-size: 2em; }
+h2 { font-size: 1.5em; }
+h3 { font-size: 1.17em; }
+h4 { font-size: 1.11em; }
+h5 { font-size: 1.05em; }
+h6 { font-size: 1em; }
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bolder;
+}
+
+/* Now the custom parts */
+
+#footer { clear: both }
+/* images */
+/* @noflip */
+div.floatright {
+ float: right;
+ clear: right;
+ margin: 0 0 1em 1em;
+}
+
+/* @noflip */
+div.floatright p {
+ font-style: italic;
+}
+
+/* @noflip */
+div.floatleft {
+ float: left;
+ clear: left;
+ margin: 0.3em 0.5em 0.5em 0;
+}
+
+/* @noflip */
+div.floatleft p {
+ font-style: italic;
+}
+
+/* table standards */
+table.rimage {
+ float: right;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+ font-size: smaller;
+}
+
+/* thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: right;
+ border: none !important;
+ background: none !important;
+ margin-left: 3px;
+}
+div.magnify a,
+div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+/* @noflip */
+div.tright {
+ clear: right;
+ float: right;
+ border-width: .5em 0 .8em 1.4em;
+}
+/* @noflip */
+div.tleft {
+ float: left;
+ clear: left;
+ margin-right: .5em;
+ border-width: .5em 1.4em .8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment { color: #4b4b4b; }
+
+img { border: none; }
+
+#toc,
+.toc {
+ border: 1px solid #bba;
+ background-color: #f7f8ff;
+ padding: 5px;
+ font-size: 95%;
+ text-align: center;
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earlier */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ padding: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.error {
+ color: red;
+ font-size: larger;
+}
+
+/* preference page with js-genrated toc */
+#preftoc {
+ float: left;
+ margin: 1em 1em 1em 1em;
+ width: 13em;
+}
+#preftoc li {
+ border: 1px solid White;
+}
+#preftoc li.selected {
+ background-color:#f9f9f9;
+ border:1px dashed #aaaaaa;
+}
+#preftoc a,
+#preftoc a:active {
+ display: block;
+ color: #005189;
+}
+.mw-prefs-buttons {
+ clear: left;
+ float: left;
+ margin-top: 1em;
+}
+div.htmlform-tip {
+ font-size: 94%;
+ margin-top: 0.4em;
+ color: #666;
+}
+fieldset.prefsection {
+ margin-top: 1em;
+}
+fieldset.operaprefsection {
+ margin-left: 15em;
+}
+
+/* emulate center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* small for tables and similar */
+.small {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+
+/* use this instead of #toc for page content */
+.toccolours {
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#siteNotice {
+ border: 1px solid #aaaaaa;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+.sharedUploadNotice {
+ font-style: italic;
+}
+span.unpatrolled {
+ font-weight: bold;
+ color: red;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #00FF00;
+}
+
+div.gallerybox {
+ width: 150px;
+}
+
+span.comment {
+ font-style: italic;
+}
+
+span.changedby {
+ font-size: 95%;
+}
+
+.previewnote {
+ text-align: center;
+ color: #cc0000;
+}
+.editExternally {
+ border-style: solid;
+ border-width: 1px;
+ border-color: gray;
+ background: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+li span.deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+ margin-left: 0.5em;
+}
+
+table.mw_metadata caption {
+ font-weight: bold;
+}
+table.mw_metadata th {
+ font-weight: normal;
+}
+table.mw_metadata td {
+ padding: 0.1em;
+}
+
+table.mw_metadata {
+ border: none;
+ border-collapse: collapse;
+}
+table.mw_metadata td,
+table.mw_metadata th {
+ border: 1px solid #aaaaaa;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+table.mw_metadata th {
+ background-color: #f9f9f9;
+}
+table.mw_metadata td {
+ background-color: #fcfcfc;
+}
+table.mw_metadata td.spacer {
+ background: inherit;
+ border-top: none;
+ border-bottom: none;
+}
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+.visualClear {
+ clear: both;
+}
+
+/* Allmessages table */
+#allmessagestable th {
+ background-color: #b2b2ff;
+}
+
+#allmessagestable tr.orig {
+ background-color: #ffe2e2;
+}
+
+#allmessagestable tr.new {
+ background-color: #e2ffe2;
+}
+
+#allmessagestable tr.def {
+ background-color: #f0f0ff;
+}
+
+#jump-to-nav {
+ display: none;
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+/*
+ Table pager (e.g. Special:Imagelist)
+ - remove underlines from the navigation link
+ - collapse borders
+ - set the borders to outsets (similar to Special:Allmessages)
+ - remove line wrapping for all td and th, set background color
+ - restore line wrapping for the last two table cells (description and size)
+*/
+.TablePager_nav a {
+ text-decoration: none;
+}
+.TablePager {
+ border-collapse: collapse;
+}
+.TablePager,
+.TablePager td,
+.TablePager th {
+ border: 0.15em solid #777777;
+ padding: 0 0.15em 0 0.15em;
+}
+.TablePager th {
+ background-color: #eeeeff;
+}
+.TablePager td {
+ background-color: #ffffff;
+}
+.TablePager tr:hover td {
+ background-color: #eeeeff;
+}
+
+.imagelist td,
+.imagelist th {
+ white-space: nowrap;
+}
+.imagelist .TablePager_col_links {
+ background-color: #eeeeff;
+}
+.imagelist .TablePager_col_img_description {
+ white-space: normal;
+}
+.imagelist th.TablePager_sort {
+ background-color: #ccccff;
+}
+
+.templatesUsed {
+ margin-top: 1em;
+}
+
+.MediaTransformError {
+ border: thin solid #777;
+ background-color: #ccc;
+ padding: 0.1em;
+}
+.MediaTransformError td {
+ text-align: center;
+ vertical-align: middle;
+ font-size: 90%;
+}
+
+form#specialpages {
+ display: inline;
+}
+
+body {
+ direction: ltr;
+ unicode-bidi: embed;
+ background-color: #ffffec;
+}
+body.ns-0 {
+ background-color: white;
+}
+
+/** RTL specific CSS starts here **/
+
+/**
+ * Lists:
+ * The following lines don't have a visible effect on non-Gecko browsers
+ * They fix a problem with Gecko browsers rendering lists to the right of
+ * left-floated objects in an RTL layout.
+ */
+/* @noflip */
+html > body.rtl div#article ul {
+ display: table;
+}
+/* @noflip */
+html > body.rtl div#bodyContent ul#filetoc {
+ display: block;
+}
+
+/* RTL specific CSS ends here **/
diff --git a/common/protect.js b/common/protect.js
new file mode 100644
index 0000000..dc142ca
--- /dev/null
+++ b/common/protect.js
@@ -0,0 +1,387 @@
+( function ( mw, $ ) {
+
+var ProtectionForm = window.ProtectionForm = {
+ existingMatch: false,
+
+ /**
+ * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
+ * on the protection form
+ *
+ * @param opts Object : parameters with members:
+ * tableId Identifier of the table containing UI bits
+ * labelText Text to use for the checkbox label
+ * numTypes The number of protection types
+ * existingMatch True if all the existing expiry times match
+ */
+ init: function ( opts ) {
+ var box, boxbody, row, cell, check, label;
+
+ if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
+ return false;
+ }
+
+ box = document.getElementById( opts.tableId );
+ if ( !box ) {
+ return false;
+ }
+
+ boxbody = box.getElementsByTagName( 'tbody' )[0];
+ row = document.createElement( 'tr' );
+ boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
+
+ this.existingMatch = opts.existingMatch;
+
+ cell = document.createElement( 'td' );
+ row.appendChild( cell );
+ // If there is only one protection type, there is nothing to chain
+ if ( opts.numTypes > 1 ) {
+ check = document.createElement( 'input' );
+ check.id = 'mwProtectUnchained';
+ check.type = 'checkbox';
+ $( check ).click( function () {
+ ProtectionForm.onChainClick();
+ } );
+
+ label = document.createElement( 'label' );
+ label.htmlFor = 'mwProtectUnchained';
+ label.appendChild( document.createTextNode( opts.labelText ) );
+
+ cell.appendChild( check );
+ cell.appendChild( document.createTextNode( ' ' ) );
+ cell.appendChild( label );
+
+ check.checked = !this.areAllTypesMatching();
+ this.enableUnchainedInputs( check.checked );
+ }
+
+ $( '#mwProtect-reason' ).byteLimit( 180 );
+
+ this.updateCascadeCheckbox();
+
+ return true;
+ },
+
+ /**
+ * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
+ */
+ updateCascadeCheckbox: function () {
+ var i, lists, items, selected;
+
+ // For non-existent titles, there is no cascade option
+ if ( !document.getElementById( 'mwProtect-cascade' ) ) {
+ return;
+ }
+ lists = this.getLevelSelectors();
+ for ( i = 0; i < lists.length; i++ ) {
+ if ( lists[i].selectedIndex > -1 ) {
+ items = lists[i].getElementsByTagName( 'option' );
+ selected = items[ lists[i].selectedIndex ].value;
+ if ( !this.isCascadeableLevel( selected ) ) {
+ document.getElementById( 'mwProtect-cascade' ).checked = false;
+ document.getElementById( 'mwProtect-cascade' ).disabled = true;
+ return;
+ }
+ }
+ }
+ document.getElementById( 'mwProtect-cascade' ).disabled = false;
+ },
+
+ /**
+ * Checks if a cerain protection level is cascadeable.
+ * @param level {String}
+ * @return {Boolean}
+ */
+ isCascadeableLevel: function ( level ) {
+ var cascadeLevels, len, i;
+
+ cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
+ // cascadeLevels isn't defined on all pages
+ if ( cascadeLevels ) {
+ for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) {
+ if ( cascadeLevels[i] === level ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+
+ /**
+ * When protection levels are locked together, update the rest
+ * when one action's level changes
+ *
+ * @param source Element Level selector that changed
+ */
+ updateLevels: function ( source ) {
+ if ( !this.isUnchained() ) {
+ this.setAllSelectors( source.selectedIndex );
+ }
+ this.updateCascadeCheckbox();
+ },
+
+ /**
+ * When protection levels are locked together, update the
+ * expiries when one changes
+ *
+ * @param source Element expiry input that changed
+ */
+
+ updateExpiry: function ( source ) {
+ var expiry, listId, list;
+
+ if ( !this.isUnchained() ) {
+ expiry = source.value;
+ this.forEachExpiryInput( function ( element ) {
+ element.value = expiry;
+ } );
+ }
+ listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+ list = document.getElementById( listId );
+ if ( list && list.value !== 'othertime' ) {
+ if ( this.isUnchained() ) {
+ list.value = 'othertime';
+ } else {
+ this.forEachExpirySelector( function ( element ) {
+ element.value = 'othertime';
+ } );
+ }
+ }
+ },
+
+ /**
+ * When protection levels are locked together, update the
+ * expiry lists when one changes and clear the custom inputs
+ *
+ * @param source Element expiry selector that changed
+ */
+ updateExpiryList: function ( source ) {
+ var expiry;
+ if ( !this.isUnchained() ) {
+ expiry = source.value;
+ this.forEachExpirySelector( function ( element ) {
+ element.value = expiry;
+ } );
+ this.forEachExpiryInput( function ( element ) {
+ element.value = '';
+ } );
+ }
+ },
+
+ /**
+ * Update chain status and enable/disable various bits of the UI
+ * when the user changes the "unlock move permissions" checkbox
+ */
+ onChainClick: function () {
+ if ( this.isUnchained() ) {
+ this.enableUnchainedInputs( true );
+ } else {
+ this.setAllSelectors( this.getMaxLevel() );
+ this.enableUnchainedInputs( false );
+ }
+ this.updateCascadeCheckbox();
+ },
+
+ /**
+ * Returns true if the named attribute in all objects in the given array are matching
+ */
+ matchAttribute: function ( objects, attrName ) {
+ var i, element, value;
+
+ // Check levels
+ value = null;
+ for ( i = 0; i < objects.length; i++ ) {
+ element = objects[i];
+ if ( value === null ) {
+ value = element[attrName];
+ } else {
+ if ( value !== element[attrName] ) {
+ return false;
+ }
+ }
+ }
+ return true;
+ },
+
+ /**
+ * Are all actions protected at the same level, with the same expiry time?
+ *
+ * @return boolean
+ */
+ areAllTypesMatching: function () {
+ return this.existingMatch
+ && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
+ && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
+ && this.matchAttribute( this.getExpiryInputs(), 'value' );
+ },
+
+ /**
+ * Is protection chaining off?
+ *
+ * @return bool
+ */
+ isUnchained: function () {
+ var element = document.getElementById( 'mwProtectUnchained' );
+ return element
+ ? element.checked
+ : true; // No control, so we need to let the user set both levels
+ },
+
+ /**
+ * Find the highest protection level in any selector
+ */
+ getMaxLevel: function () {
+ var maxIndex = -1;
+ this.forEachLevelSelector( function ( element ) {
+ if ( element.selectedIndex > maxIndex ) {
+ maxIndex = element.selectedIndex;
+ }
+ } );
+ return maxIndex;
+ },
+
+ /**
+ * Protect all actions at the specified level
+ *
+ * @param index int Protection level
+ */
+ setAllSelectors: function ( index ) {
+ this.forEachLevelSelector( function ( element ) {
+ if ( element.selectedIndex !== index ) {
+ element.selectedIndex = index;
+ }
+ } );
+ },
+
+ /**
+ * Apply a callback to each protection selector
+ *
+ * @param func callable Callback function
+ */
+ forEachLevelSelector: function ( func ) {
+ var i, selectors;
+
+ selectors = this.getLevelSelectors();
+ for ( i = 0; i < selectors.length; i++ ) {
+ func( selectors[i] );
+ }
+ },
+
+ /**
+ * Get a list of all protection selectors on the page
+ *
+ * @return Array
+ */
+ getLevelSelectors: function () {
+ var i, ours, all, element;
+
+ all = document.getElementsByTagName( 'select' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.id.match( /^mwProtect-level-/ ) ) {
+ ours[ours.length] = element;
+ }
+ }
+ return ours;
+ },
+
+ /**
+ * Apply a callback to each expiry input
+ *
+ * @param func callable Callback function
+ */
+ forEachExpiryInput: function ( func ) {
+ var i, inputs;
+
+ inputs = this.getExpiryInputs();
+ for ( i = 0; i < inputs.length; i++ ) {
+ func( inputs[i] );
+ }
+ },
+
+ /**
+ * Get a list of all expiry inputs on the page
+ *
+ * @return Array
+ */
+ getExpiryInputs: function () {
+ var i, all, element, ours;
+
+ all = document.getElementsByTagName( 'input' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.name.match( /^mwProtect-expiry-/ ) ) {
+ ours[ours.length] = element;
+ }
+ }
+ return ours;
+ },
+
+ /**
+ * Apply a callback to each expiry selector list
+ * @param func callable Callback function
+ */
+ forEachExpirySelector: function ( func ) {
+ var i, inputs;
+
+ inputs = this.getExpirySelectors();
+ for ( i = 0; i < inputs.length; i++ ) {
+ func( inputs[i] );
+ }
+ },
+
+ /**
+ * Get a list of all expiry selector lists on the page
+ *
+ * @return Array
+ */
+ getExpirySelectors: function () {
+ var i, all, ours, element;
+
+ all = document.getElementsByTagName( 'select' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
+ ours[ours.length] = element;
+ }
+ }
+ return ours;
+ },
+
+ /**
+ * Enable/disable protection selectors and expiry inputs
+ *
+ * @param val boolean Enable?
+ */
+ enableUnchainedInputs: function ( val ) {
+ var first = true;
+
+ this.forEachLevelSelector( function ( element ) {
+ if ( first ) {
+ first = false;
+ } else {
+ element.disabled = !val;
+ }
+ } );
+ first = true;
+ this.forEachExpiryInput( function ( element ) {
+ if ( first ) {
+ first = false;
+ } else {
+ element.disabled = !val;
+ }
+ } );
+ first = true;
+ this.forEachExpirySelector( function ( element ) {
+ if ( first ) {
+ first = false;
+ } else {
+ element.disabled = !val;
+ }
+ } );
+ }
+};
+
+}( mediaWiki, jQuery ) );
diff --git a/common/shared.css b/common/shared.css
new file mode 100644
index 0000000..6b052b3
--- /dev/null
+++ b/common/shared.css
@@ -0,0 +1,1216 @@
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor pre-Monobook users either.
+ */
+
+/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
+
+/**
+ * These classes should be used for text depending on the content direction.
+ * Content stuff like editsection, ul/ol and TOC depend on this.
+ */
+.mw-content-ltr {
+ /* @noflip */
+ direction: ltr;
+}
+.mw-content-rtl {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* Most input fields should be in site direction */
+.sitedir-ltr textarea,
+.sitedir-ltr input {
+ /* @noflip */
+ direction: ltr;
+}
+.sitedir-rtl textarea,
+.sitedir-rtl input {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* User-Agent styles for new HTML5 elements */
+mark {
+ background-color: yellow;
+ color: black;
+}
+
+/* Input types that should follow user direction, like buttons */
+/* TODO: What about buttons in wikipage content ? */
+input[type="submit"],
+input[type="button"],
+input[type="reset"],
+input[type="file"] {
+ direction: ltr;
+}
+
+/* Override default values */
+textarea[dir="ltr"],
+input[dir="ltr"] {
+ /* @noflip */
+ direction: ltr;
+}
+textarea[dir="rtl"],
+input[dir="rtl"] {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* Default style for semantic tags */
+abbr[title],
+.explain[title] {
+ border-bottom: 1px dotted;
+ cursor: help;
+}
+
+/* Colored watchlist and recent changes numbers */
+.mw-plusminus-pos {
+ color: #006400; /* dark green */
+}
+.mw-plusminus-neg {
+ color: #8b0000; /* dark red */
+}
+.mw-plusminus-null {
+ color: #aaa; /* gray */
+}
+
+/**
+ * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
+ * [[Special:Watchlist/edit]] and in category listings.
+ */
+.allpagesredirect,
+.redirect-in-category,
+.watchlistredir {
+ font-style: italic;
+}
+
+/* Comment and username portions of RC entries */
+span.comment {
+ font-style: italic;
+}
+
+span.changedby {
+ font-size: 95%;
+}
+
+/* Math */
+.texvc {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+img.tex {
+ vertical-align: middle;
+}
+span.texhtml {
+ font-family: serif;
+}
+
+/**
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+ margin-bottom: 1em;
+}
+
+/* Stop floats from intruding into edit area in previews */
+#editform,
+#toolbar,
+#wpTextbox1 {
+ clear: both;
+}
+
+#toolbar img {
+ cursor: pointer;
+}
+
+/**
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+ font-size: smaller;
+}
+
+/**
+ * File histories
+ */
+h2#filehistory {
+ clear: both;
+}
+
+table.filehistory th,
+table.filehistory td {
+ vertical-align: top;
+}
+table.filehistory th {
+ text-align: left;
+}
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+ white-space: nowrap;
+}
+
+table.filehistory td.filehistory-selected {
+ font-weight: bold;
+}
+
+/**
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+ /* @embed */
+ background: white url(images/Checker-16x16.png) repeat;
+}
+
+/**
+ * rev_deleted stuff
+ */
+li span.deleted,
+span.history-deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+/**
+ * Patrol stuff
+ */
+.not-patrolled {
+ background-color: #ffa;
+}
+
+.unpatrolled {
+ font-weight: bold;
+ color: red;
+}
+
+div.patrollink {
+ font-size: 75%;
+ text-align: right;
+}
+
+/**
+ * Forms
+ */
+td.mw-label {
+ text-align: right;
+}
+td.mw-input {
+ text-align: left;
+}
+td.mw-submit {
+ text-align: left;
+}
+
+td.mw-label {
+ vertical-align: top;
+}
+.prefsection td.mw-label {
+ width: 20%;
+}
+.prefsection table {
+ width: 100%;
+}
+.prefsection table.mw-htmlform-matrix {
+ width: auto;
+}
+
+.mw-icon-question {
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG).
+ * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+ background-image: url(images/question-small.png);
+ /* @embed */
+ background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
+ /* @embed */
+ background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+ background-repeat: no-repeat;
+ background-size: 13px 13px;
+ display: inline-block;
+ height: 13px;
+ width: 13px;
+ margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+ -webkit-transform: scaleX(-1);
+ -ms-transform: scaleX(-1);
+ transform: scaleX(-1);
+}
+
+td.mw-submit {
+ white-space: nowrap;
+}
+
+table.mw-htmlform-nolabel td.mw-label {
+ width: 1px;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+ text-align: left !important;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+ border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+ display: inline;
+ margin-right: 1em;
+ white-space: nowrap;
+}
+
+.mw-htmlform-matrix td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+
+input#wpSummary {
+ width: 80%;
+ margin-bottom: 1em;
+}
+
+/**
+ * Image captions
+ */
+/* @noflip */
+.mw-content-ltr .thumbcaption {
+ text-align: left;
+}
+/* @noflip */
+.mw-content-rtl .thumbcaption {
+ text-align: right;
+}
+/* @noflip */
+.mw-content-ltr .magnify {
+ float: right;
+}
+/* @noflip */
+.mw-content-rtl .magnify {
+ float: left;
+}
+
+/**
+ * Categories
+ */
+#catlinks {
+ /**
+ * Overrides text justification (user preference)
+ * See bug 31990
+ */
+ text-align: left;
+}
+.catlinks ul {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ list-style-type: none;
+ list-style-image: none;
+ vertical-align: middle !ie;
+}
+
+.catlinks li {
+ display: inline-block;
+ line-height: 1.25em;
+ border-left: 1px solid #AAA;
+ margin: 0.125em 0;
+ padding: 0 0.5em;
+ zoom: 1;
+ display: inline !ie;
+}
+
+.catlinks li:first-child {
+ padding-left: 0.25em;
+ border-left: none;
+}
+
+/* (bug 5346) make category redirects italic */
+.catlinks li a.mw-redirect {
+ font-style: italic;
+}
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden {
+ display: none;
+}
+.catlinks-allhidden {
+ display: none;
+}
+
+/* Convenience links to edit block, delete and protect reasons */
+p.mw-ipb-conveniencelinks,
+p.mw-protect-editreasons,
+p.mw-filedelete-editreasons,
+p.mw-delete-editreasons,
+p.mw-revdel-editreasons {
+ font-size: 90%;
+ text-align: right;
+}
+
+/**
+ * OpenSearch ajax suggestions
+ */
+.os-suggest {
+ overflow: auto;
+ overflow-x: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 0;
+ background-color: white;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ z-index:99;
+ font-size:95%;
+}
+
+table.os-suggest-results {
+ font-size: 95%;
+ cursor: pointer;
+ border: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+.os-suggest-result,
+.os-suggest-result-hl {
+ white-space: nowrap;
+ background-color: white;
+ color: black;
+ padding: 2px;
+}
+.os-suggest-result-hl,
+.os-suggest-result-hl-webkit {
+ background-color: #4C59A6;
+ color: white;
+}
+
+.os-suggest-toggle {
+ position: relative;
+ left: 1ex;
+ font-size: 65%;
+}
+.os-suggest-toggle-def {
+ position: absolute;
+ top: 0;
+ left: 0;
+ font-size: 65%;
+ visibility: hidden;
+}
+
+/* Page history styling */
+
+/* The auto-generated edit comments */
+.autocomment {
+ color: gray;
+}
+#pagehistory .history-user {
+ margin-left: 0.4em;
+ margin-right: 0.2em;
+}
+#pagehistory span.minor {
+ font-weight: bold;
+}
+#pagehistory li {
+ border: 1px solid white;
+}
+#pagehistory li.selected {
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
+}
+
+.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
+ float: right;
+}
+
+/** Generic minor/bot/newpage styling (recent changes) */
+.newpage,
+.minoredit,
+.botedit {
+ font-weight: bold;
+}
+
+#shared-image-dup,
+#shared-image-conflict {
+ font-style: italic;
+}
+
+/**
+ * Recreating deleted page warning
+ * Reupload file warning
+ * Page protection warning
+ * incl. log entries for these warnings
+ */
+div.mw-warning-with-logexcerpt {
+ padding: 3px;
+ margin-bottom: 3px;
+ border: 2px solid #2F6FAB;
+ clear: both;
+}
+div.mw-warning-with-logexcerpt ul li {
+ font-size: 90%;
+}
+
+/* (show/hide) revision deletion links */
+span.mw-revdelundel-link,
+strong.mw-revdelundel-link {
+ font-size: 90%;
+}
+span.mw-revdelundel-hidden,
+input.mw-revdelundel-hidden {
+ visibility: hidden;
+}
+
+td.mw-revdel-checkbox,
+th.mw-revdel-checkbox {
+ padding-right: 10px;
+ text-align: center;
+}
+
+/* red links; see bug 36276 */
+a.new {
+ color: #BA0000;
+}
+
+/* feed links */
+a.feedlink {
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG).
+ * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+ background-image: url(images/feed-icon.png);
+ /* @embed */
+ background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+ /* @embed */
+ background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+ background-position: center left;
+ background-repeat: no-repeat;
+ background-size: 12px 12px;
+ padding-left: 16px;
+}
+
+/* Plainlinks - this can be used to switch
+ * off special external link styling */
+.plainlinks a {
+ background: none !important;
+ padding: 0 !important;
+}
+/* External URLs should always be treated as LTR (bug 4330) */
+/* @noflip */ .rtl a.external.free,
+.rtl a.external.autonumber {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+/**
+ * wikitable class for skinning normal tables
+ * keep in sync with commonPrint.css
+ */
+table.wikitable {
+ margin: 1em 0;
+ background-color: #f9f9f9;
+ border: 1px #aaa solid;
+ border-collapse: collapse;
+ color: black;
+}
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td {
+ border: 1px #aaa solid;
+ padding: 0.2em;
+}
+table.wikitable > tr > th,
+table.wikitable > * > tr > th {
+ background-color: #f2f2f2;
+ text-align: center;
+}
+table.wikitable > caption {
+ font-weight: bold;
+}
+
+/**
+ * Hide collapsable rows in a collapsed table.
+ *
+ * Used by ImagePage and the mediawiki.action.view.metadata module.
+ */
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+/* success and error messages */
+.error,
+.warning,
+.success {
+ font-size: larger;
+}
+.error {
+ color: #cc0000;
+}
+.warning {
+ color: #705000;
+}
+.success {
+ color: #009000;
+}
+
+.errorbox,
+.warningbox,
+.successbox {
+ border: 1px solid;
+ padding: .5em 1em;
+ margin-bottom: 1em;
+ display: -moz-inline-block;
+ display: inline-block;
+ zoom: 1;
+ *display: inline;
+}
+.errorbox h2,
+.warningbox h2,
+.successbox h2 {
+ font-size: 1em;
+ color: inherit;
+ font-weight: bold;
+ display: inline;
+ margin: 0 .5em 0 0;
+ border: none;
+}
+.errorbox {
+ color: #cc0000;
+ border-color: #fac5c5;
+ background-color: #fae3e3;
+}
+.warningbox {
+ color: #705000;
+ border-color: #fde29b;
+ background-color: #fdf1d1;
+}
+.successbox {
+ color: #009000;
+ border-color: #b7fdb5;
+ background-color: #e1fddf;
+}
+
+/* general info/warning box for SP */
+.mw-infobox {
+ border: 2px solid #ff7f00;
+ margin: 0.5em;
+ clear: left;
+ overflow: hidden;
+}
+
+.mw-infobox-left {
+ margin: 7px;
+ float: left;
+ width: 35px;
+}
+
+.mw-infobox-right {
+ margin: 0.5em 0.5em 0.5em 49px;
+}
+
+/* Note on preview page */
+.previewnote {
+ color: #c00;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ text-indent: 3em;
+ margin: 0.8em 0;
+}
+
+.visualClear {
+ clear: both;
+}
+
+/**
+ * Data table style
+ *
+ * Transparent table with suddle borders
+ * and blue row-highlighting.
+ */
+.mw-datatable {
+ border-collapse: collapse;
+}
+.mw-datatable,
+.mw-datatable td,
+.mw-datatable th {
+ border: 1px solid #aaaaaa;
+ padding: 0 0.15em 0 0.15em;
+}
+.mw-datatable th {
+ background-color: #ddddff;
+}
+.mw-datatable td {
+ background-color: #ffffff;
+}
+.mw-datatable tr:hover td {
+ background-color: #eeeeff;
+}
+
+
+/**
+ * TablePager tables generated by the TablePager PHP class
+ * in MediaWiki (e.g. Special:ListFiles).
+ */
+.TablePager {
+ min-width: 80%;
+}
+.TablePager_nav {
+ margin: 0 auto;
+}
+.TablePager_nav td {
+ padding: 3px;
+ text-align: center;
+}
+.TablePager_nav a {
+ text-decoration: none;
+}
+
+.imagelist td,
+.imagelist th {
+ white-space: nowrap;
+}
+.imagelist .TablePager_col_links {
+ background-color: #eeeeff;
+}
+.imagelist .TablePager_col_img_description {
+ white-space: normal;
+}
+.imagelist th.TablePager_sort {
+ background-color: #ccccff;
+}
+
+/* filetoc */
+ul#filetoc {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+ margin-bottom: 0.5em;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#filetoc li {
+ display: inline;
+ list-style-type: none;
+ padding-right: 2em;
+}
+
+/* Classes for Exif data display */
+table.mw_metadata {
+ font-size: 0.8em;
+ margin-left: 0.5em;
+ margin-bottom: 0.5em;
+ width: 400px;
+}
+
+table.mw_metadata caption {
+ font-weight: bold;
+}
+
+table.mw_metadata th {
+ font-weight: normal;
+}
+
+table.mw_metadata td {
+ padding: 0.1em;
+}
+
+table.mw_metadata {
+ border: none;
+ border-collapse: collapse;
+}
+
+table.mw_metadata td,
+table.mw_metadata th {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+table.mw_metadata th {
+ background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+ background-color: #fcfcfc;
+}
+
+table.mw_metadata ul.metadata-langlist {
+ list-style-type: none;
+ list-style-image: none;
+ padding-right: 5px;
+ padding-left: 5px;
+ margin: 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+.mw-content-ltr ul,
+.mw-content-rtl .mw-content-ltr ul {
+ /* @noflip */
+ margin: 0.3em 0 0 1.6em;
+ padding: 0;
+}
+.mw-content-rtl ul,
+.mw-content-ltr .mw-content-rtl ul {
+ /* @noflip */
+ margin: 0.3em 1.6em 0 0;
+ padding: 0;
+}
+.mw-content-ltr ol,
+.mw-content-rtl .mw-content-ltr ol {
+ /* @noflip */
+ margin: 0.3em 0 0 3.2em;
+ padding: 0;
+}
+.mw-content-rtl ol,
+.mw-content-ltr .mw-content-rtl ol {
+ /* @noflip */
+ margin: 0.3em 3.2em 0 0;
+ padding: 0;
+}
+/* @noflip */
+.mw-content-ltr dd,
+.mw-content-rtl .mw-content-ltr dd {
+ margin-left: 1.6em;
+ margin-right: 0;
+}
+/* @noflip */
+.mw-content-rtl dd,
+.mw-content-ltr .mw-content-rtl dd {
+ margin-right: 1.6em;
+ margin-left: 0;
+}
+
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.css */
+li.gallerybox {
+ vertical-align: top;
+ display: -moz-inline-box;
+ display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+ zoom: 1;
+ *display: inline;
+}
+
+ul.gallery {
+ margin: 2px;
+ padding: 2px;
+ display: block;
+}
+
+li.gallerycaption {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ background-color: #f9f9f9;
+ margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+ display: block;
+ margin: 0 auto;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+ word-wrap: break-word;
+}
+
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+ background-color: transparent;
+ border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+ text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+ background-color: transparent;
+ border: none;
+}
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+ margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+ position:relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+ overflow: hidden;
+ height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+ position:absolute;
+ background: white;
+ background: rgba(255, 255, 255, 0.8);
+ padding: 5px 10px;
+ bottom: 0;
+ left: 0; /* Needed for IE */
+ height: auto;
+ font-weight: bold;
+ margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+ text-align: center;
+}
+
+.mw-ajax-loader {
+ /* @embed */
+ background-image: url(images/ajax-loader.gif);
+ background-position: center center;
+ background-repeat: no-repeat;
+ padding: 16px;
+ position: relative;
+ top: -16px;
+}
+
+.mw-small-spinner {
+ padding: 10px !important;
+ margin-right: 0.6em;
+ /* @embed */
+ background-image: url(images/spinner.gif);
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(anp),
+h1:lang(as),
+h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang(bho),
+h1:lang(bn),
+h1:lang(gu),
+h1:lang(hi),
+h1:lang(kn),
+h1:lang(ks),
+h1:lang(ml),
+h1:lang(mr),
+h1:lang(my),
+h1:lang(mai),
+h1:lang(ne),
+h1:lang(new),
+h1:lang(or),
+h1:lang(pa),
+h1:lang(pi),
+h1:lang(sa),
+h1:lang(ta),
+h1:lang(te) {
+ line-height: 1.6em !important;
+}
+h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
+h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
+h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
+h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
+h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
+h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
+h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
+h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
+h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
+h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
+h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
+h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
+h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
+h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
+h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
+h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
+h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
+h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+ line-height: 1.2em;
+}
+
+/* Localised ordered list numbering for some languages */
+ol:lang(bcc) li,
+ol:lang(bqi) li,
+ol:lang(fa) li,
+ol:lang(glk) li,
+ol:lang(kk-arab) li,
+ol:lang(mzn) li {
+ list-style-type: -moz-persian;
+ list-style-type: persian;
+}
+
+ol:lang(ckb) li {
+ list-style-type: -moz-arabic-indic;
+ list-style-type: arabic-indic;
+}
+
+ol:lang(hi) li,
+ol:lang(mr) li {
+ list-style-type: -moz-devanagari;
+ list-style-type: devanagari;
+}
+
+ol:lang(as) li,
+ol:lang(bn) li {
+ list-style-type: -moz-bengali;
+ list-style-type: bengali;
+}
+
+ol:lang(or) li {
+ list-style-type: -moz-oriya;
+ list-style-type: oriya;
+}
+
+#toc ul, .toc ul {
+ margin: .3em 0;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */ .mw-content-ltr .toc ul,
+.mw-content-ltr #toc ul,
+.mw-content-rtl .mw-content-ltr .toc ul,
+.mw-content-rtl .mw-content-ltr #toc ul {
+ text-align: left;
+}
+/* @noflip */ .mw-content-rtl .toc ul,
+.mw-content-rtl #toc ul,
+.mw-content-ltr .mw-content-rtl .toc ul,
+.mw-content-ltr .mw-content-rtl #toc ul {
+ text-align: right;
+}
+/* @noflip */ .mw-content-ltr .toc ul ul,
+.mw-content-ltr #toc ul ul,
+.mw-content-rtl .mw-content-ltr .toc ul ul,
+.mw-content-rtl .mw-content-ltr #toc ul ul {
+ margin: 0 0 0 2em;
+}
+/* @noflip */ .mw-content-rtl .toc ul ul,
+.mw-content-rtl #toc ul ul,
+.mw-content-ltr .mw-content-rtl .toc ul ul,
+.mw-content-ltr .mw-content-rtl #toc ul ul {
+ margin: 0 2em 0 0;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ direction: ltr;
+}
+
+/* tooltip styles */
+.mw-help-field-hint {
+ display: none;
+ margin-left: 2px;
+ margin-bottom: -8px;
+ padding: 0 0 0 15px;
+ /* @embed */
+ background-image: url(images/help-question.gif);
+ background-position: left center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ font-size: .8em;
+ text-decoration: underline;
+ color: #0645ad;
+}
+.mw-help-field-hint:hover {
+ /* @embed */
+ background-image: url(images/help-question-hover.gif);
+}
+.mw-help-field-data {
+ display: block;
+ background-color: #d6f3ff;
+ padding:5px 8px 4px 8px;
+ border: 1px solid #5dc9f4;
+ margin-left: 20px;
+}
+.tipsy {
+ padding: 5px 5px 10px;
+ font-size: 12px;
+ position: absolute;
+ z-index: 100000;
+ overflow: visible;
+}
+.tipsy-inner {
+ padding: 5px 8px 4px 8px;
+ background-color: #d6f3ff;
+ color: black;
+ border: 1px solid #5dc9f4;
+ max-width: 300px;
+ text-align: left;
+}
+.tipsy-arrow {
+ position: absolute;
+ /* @embed */
+ background: url(images/tipsy-arrow.gif) no-repeat top left;
+ width: 13px;
+ height: 13px;
+}
+.tipsy-se .tipsy-arrow {
+ bottom: -2px;
+ right: 10px;
+ background-position: 0% 100%;
+}
+
+#mw-clearyourcache,
+#mw-sitecsspreview,
+#mw-sitejspreview,
+#mw-usercsspreview,
+#mw-userjspreview {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+/* Correct user & content directionality when viewing a diff */
+.diff-currentversion-title,
+.diff {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+/* @noflip */ .diff-contentalign-right td {
+ direction: rtl;
+ unicode-bidi: embed;
+}
+/* @noflip */ .diff-contentalign-left td {
+ direction: ltr;
+ unicode-bidi: embed;
+}
+.diff-multi,
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
+ direction: ltr !important;
+ unicode-bidi: embed;
+}
+
+#mw-revision-info,
+#mw-revision-info-current,
+#mw-revision-nav {
+ direction: ltr;
+ display: inline;
+}
+
+/* Images */
+
+/* @noflip */ div.tright,
+div.floatright,
+table.floatright {
+ clear: right;
+ float: right;
+}
+/* @noflip */ div.tleft,
+div.floatleft,
+table.floatleft {
+ float: left;
+ clear: left;
+}
+div.floatright,
+table.floatright,
+div.floatleft,
+table.floatleft {
+ position: relative;
+}
+
+/* bug 12205 */
+#mw-credits a {
+ unicode-bidi: embed;
+}
+
+/* Accessibility */
+.mw-jump,
+#jump-to-nav {
+ overflow: hidden;
+ height: 0;
+ zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
+}
+
+/* Print footer should be hidden by default in screen. */
+.printfooter {
+ display: none;
+}
+
+/* For developers */
+.xdebug-error {
+ position: absolute;
+ z-index: 99;
+}
+
+.mw-editsection,
+.toctoggle,
+#jump-to-nav {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection,
+.mw-editsection-like {
+ font-size: small;
+ font-weight: normal;
+ margin-left: 1em;
+ vertical-align: baseline;
+ /* Reset line-height; headings tend to have it set to larger values */
+ line-height: 1em;
+ /* As .mw-editsection is a <span> (inline element), it is treated as part */
+ /* of the heading content when selecting text by multiple clicks and thus */
+ /* selected together with heading content, despite the user-select: none; */
+ /* rule set above. This enforces non-selection without changing the look. */
+ display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+ margin-left: 1em;
+}
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+ margin-right: 1em;
+}
+
+/* Prevent citations and subscripts from interfering with the line-height */
+sup,
+sub {
+ line-height: 1;
+}
diff --git a/common/upload.js b/common/upload.js
new file mode 100644
index 0000000..7933caf
--- /dev/null
+++ b/common/upload.js
@@ -0,0 +1,355 @@
+/*jshint camelcase:false */
+( function ( mw, $ ) {
+var licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
+ ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+ fileExtensions = mw.config.get( 'wgFileExtensions' ),
+ $spinnerDestCheck, $spinnerLicense;
+
+licenseSelectorCheck = window.licenseSelectorCheck = function () {
+ var selector = document.getElementById( 'wpLicense' ),
+ selection = selector.options[selector.selectedIndex].value;
+ if ( selector.selectedIndex > 0 ) {
+ if ( !selection ) {
+ // Option disabled, but browser is broken and doesn't respect this
+ selector.selectedIndex = 0;
+ }
+ }
+ // We might show a preview
+ wgUploadLicenseObj.fetchPreview( selection );
+};
+
+function uploadSetup() {
+ // Disable URL box if the URL copy upload source type is not selected
+ var ein,
+ selector, ua, isMacIe, i,
+ optionsTable, row, td,
+ wpLicense, wpLicenseRow, wpLicenseTbody,
+ uploadSourceIds, len, onchange,
+ e = document.getElementById( 'wpSourceTypeurl' );
+ if ( e ) {
+ if ( !e.checked ) {
+ ein = document.getElementById( 'wpUploadFileURL' );
+ if ( ein ) {
+ ein.disabled = true;
+ }
+ }
+ }
+
+ // For MSIE/Mac: non-breaking spaces cause the <option> not to render.
+ // But for some reason, setting the text to itself works
+ selector = document.getElementById( 'wpLicense' );
+ if ( selector ) {
+ ua = navigator.userAgent;
+ isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
+ if ( isMacIe ) {
+ for ( i = 0; i < selector.options.length; i++ ) {
+ selector.options[i].text = selector.options[i].text;
+ }
+ }
+ }
+
+ // AJAX wpDestFile warnings
+ if ( ajaxUploadDestCheck ) {
+ // Insert an event handler that fetches upload warnings when wpDestFile
+ // has been changed
+ document.getElementById( 'wpDestFile' ).onchange = function () {
+ wgUploadWarningObj.checkNow( this.value );
+ };
+ // Insert a row where the warnings will be displayed just below the
+ // wpDestFile row
+ optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
+ row = optionsTable.insertRow( 1 );
+ td = document.createElement( 'td' );
+ td.id = 'wpDestFile-warning';
+ td.colSpan = 2;
+
+ row.appendChild( td );
+ }
+
+ wpLicense = document.getElementById( 'wpLicense' );
+ if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
+ // License selector check
+ wpLicense.onchange = licenseSelectorCheck;
+
+ // License selector table row
+ wpLicenseRow = wpLicense.parentNode.parentNode;
+ wpLicenseTbody = wpLicenseRow.parentNode;
+
+ row = document.createElement( 'tr' );
+ td = document.createElement( 'td' );
+ row.appendChild( td );
+ td = document.createElement( 'td' );
+ td.id = 'mw-license-preview';
+ row.appendChild( td );
+
+ wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling );
+ }
+
+ // fillDestFile setup
+ uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
+ len = uploadSourceIds.length;
+ onchange = function () {
+ fillDestFilename( this.id );
+ };
+ for ( i = 0; i < len; i += 1 ) {
+ document.getElementById( uploadSourceIds[i] ).onchange = onchange;
+ }
+}
+
+wgUploadWarningObj = window.wgUploadWarningObj = {
+ responseCache: { '': '&nbsp;' },
+ nameToCheck: '',
+ typing: false,
+ delay: 500, // ms
+ timeoutID: false,
+
+ keypress: function () {
+ var cached, destFile, warningElt;
+
+ if ( !ajaxUploadDestCheck ) {
+ return;
+ }
+
+ // Find file to upload
+ destFile = document.getElementById( 'wpDestFile' );
+ warningElt = document.getElementById( 'wpDestFile-warning' );
+ if ( !destFile || !warningElt ) {
+ return;
+ }
+
+ this.nameToCheck = destFile.value;
+
+ // Clear timer
+ if ( this.timeoutID ) {
+ clearTimeout( this.timeoutID );
+ }
+ // Check response cache
+ for ( cached in this.responseCache ) {
+ if ( this.nameToCheck === cached ) {
+ this.setWarning(this.responseCache[this.nameToCheck]);
+ return;
+ }
+ }
+
+ this.timeoutID = setTimeout( function () {
+ wgUploadWarningObj.timeout();
+ }, this.delay );
+ },
+
+ checkNow: function ( fname ) {
+ if ( !ajaxUploadDestCheck ) {
+ return;
+ }
+ if ( this.timeoutID ) {
+ clearTimeout( this.timeoutID );
+ }
+ this.nameToCheck = fname;
+ this.timeout();
+ },
+
+ timeout: function () {
+ if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+ return;
+ }
+ $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
+
+ var uploadWarningObj = this;
+ ( new mw.Api() ).get( {
+ action: 'query',
+ titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
+ prop: 'imageinfo',
+ iiprop: 'uploadwarning',
+ indexpageids: ''
+ } ).done( function ( result ) {
+ var resultOut = '';
+ if ( result.query ) {
+ resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
+ }
+ uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck );
+ } );
+ },
+
+ processResult: function ( result, fileName ) {
+ $spinnerDestCheck.remove();
+ $spinnerDestCheck = undefined;
+ this.setWarning( result.html );
+ this.responseCache[fileName] = result.html;
+ },
+
+ setWarning: function ( warning ) {
+ var warningElt = document.getElementById( 'wpDestFile-warning' ),
+ ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
+
+ this.setInnerHTML( warningElt, warning );
+
+ // Set a value in the form indicating that the warning is acknowledged and
+ // doesn't need to be redisplayed post-upload
+ if ( !warning ) {
+ ackElt[0].value = '';
+ } else {
+ ackElt[0].value = '1';
+ }
+
+ },
+ setInnerHTML: function ( element, text ) {
+ // Check for no change to avoid flicker in IE 7
+ if ( element.innerHTML !== text ) {
+ element.innerHTML = text;
+ }
+ }
+};
+
+fillDestFilename = window.fillDestFilename = function ( id ) {
+ var e, path, slash, backslash, fname,
+ found, ext, i,
+ destFile;
+ if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
+ return;
+ }
+ if ( !document.getElementById ) {
+ return;
+ }
+ // Remove any previously flagged errors
+ e = document.getElementById( 'mw-upload-permitted' );
+ if ( e ) {
+ e.className = '';
+ }
+
+ e = document.getElementById( 'mw-upload-prohibited' );
+ if ( e ) {
+ e.className = '';
+ }
+
+ path = document.getElementById( id ).value;
+ // Find trailing part
+ slash = path.lastIndexOf( '/' );
+ backslash = path.lastIndexOf( '\\' );
+ if ( slash === -1 && backslash === -1 ) {
+ fname = path;
+ } else if ( slash > backslash ) {
+ fname = path.substring( slash + 1, 10000 );
+ } else {
+ fname = path.substring( backslash + 1, 10000 );
+ }
+
+ // Clear the filename if it does not have a valid extension.
+ // URLs are less likely to have a useful extension, so don't include them in the
+ // extension check.
+ if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
+ found = false;
+ if ( fname.lastIndexOf( '.' ) !== -1 ) {
+ ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
+ for ( i = 0; i < fileExtensions.length; i += 1 ) {
+ if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if ( !found ) {
+ // Not a valid extension
+ // Clear the upload and set mw-upload-permitted to error
+ document.getElementById( id ).value = '';
+ e = document.getElementById( 'mw-upload-permitted' );
+ if ( e ) {
+ e.className = 'error';
+ }
+
+ e = document.getElementById( 'mw-upload-prohibited' );
+ if ( e ) {
+ e.className = 'error';
+ }
+
+ // Clear wpDestFile as well
+ e = document.getElementById( 'wpDestFile' );
+ if ( e ) {
+ e.value = '';
+ }
+
+ return false;
+ }
+ }
+
+ // Replace spaces by underscores
+ fname = fname.replace( / /g, '_' );
+ // Capitalise first letter if needed
+ if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
+ fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) );
+ }
+
+ // Output result
+ destFile = document.getElementById( 'wpDestFile' );
+ if ( destFile ) {
+ // Call decodeURIComponent function to remove possible URL-encoded characters
+ // from the file name (bug 30390). Especially likely with upload-form-url.
+ // decodeURIComponent can throw an exception in input is invalid utf-8
+ try {
+ destFile.value = decodeURIComponent( fname );
+ } catch ( err ) {
+ destFile.value = fname;
+ }
+ wgUploadWarningObj.checkNow( fname );
+ }
+};
+
+window.toggleFilenameFiller = function () {
+ if ( !document.getElementById ) {
+ return;
+ }
+ var destName = document.getElementById( 'wpDestFile' ).value;
+ mw.config.set( 'wgUploadAutoFill', !destName );
+};
+
+wgUploadLicenseObj = window.wgUploadLicenseObj = {
+
+ responseCache: { '': '' },
+
+ fetchPreview: function ( license ) {
+ var cached, title;
+ if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+ return;
+ }
+ for ( cached in this.responseCache ) {
+ if ( cached === license ) {
+ this.showPreview( this.responseCache[license] );
+ return;
+ }
+ }
+
+ $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
+
+ title = document.getElementById( 'wpDestFile' ).value;
+ if ( !title ) {
+ title = 'File:Sample.jpg';
+ }
+
+ ( new mw.Api() ).get( {
+ action: 'parse',
+ text: '{{' + license + '}}',
+ title: title,
+ prop: 'text',
+ pst: ''
+ } ).done( function ( result ) {
+ wgUploadLicenseObj.processResult( result, license );
+ } );
+ },
+
+ processResult: function ( result, license ) {
+ $spinnerLicense.remove();
+ $spinnerLicense = undefined;
+ this.responseCache[license] = result.parse.text['*'];
+ this.showPreview( this.responseCache[license] );
+ },
+
+ showPreview: function ( preview ) {
+ var previewPanel = document.getElementById( 'mw-license-preview' );
+ if ( previewPanel.innerHTML !== preview ) {
+ previewPanel.innerHTML = preview;
+ }
+ }
+
+};
+
+$( uploadSetup );
+
+}( mediaWiki, jQuery ) );
diff --git a/common/wikibits.js b/common/wikibits.js
new file mode 100644
index 0000000..516035e
--- /dev/null
+++ b/common/wikibits.js
@@ -0,0 +1,243 @@
+/**
+ * MediaWiki legacy wikibits
+ */
+( function ( mw, $ ) {
+ var msg,
+ win = window,
+ ua = navigator.userAgent.toLowerCase(),
+ isIE6 = ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ),
+ isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua ),
+ onloadFuncts = [];
+
+if ( mw.config.get( 'wgBreakFrames' ) ) {
+ // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
+ // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
+ if ( win.top !== win.self ) {
+ // Un-trap us from framesets
+ win.top.location = win.location;
+ }
+}
+
+/**
+ * Legacy function to scroll to an id while viewing the page over a redirect.
+ * Superseeded by module 'mediawiki.action.view.redirectToFragment' in version 1.23.
+ * Kepted because cache can contain still inline script calls to this function.
+ * Should be removed in version 1.24.
+ * @deprecated since 1.23 Use mediawiki.action.view.redirectToFragment instead
+ */
+mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) {
+ var webKitVersion,
+ match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
+ if ( match ) {
+ webKitVersion = parseInt( match[1], 10 );
+ if ( webKitVersion < 420 ) {
+ // Released Safari w/ WebKit 418.9.1 messes up horribly
+ // Nightlies of 420+ are ok
+ return;
+ }
+ }
+ if ( !win.location.hash ) {
+ win.location.hash = fragment;
+
+ // Mozilla needs to wait until after load, otherwise the window doesn't
+ // scroll. See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+ // There's no obvious way to detect this programmatically, so we use
+ // version-testing. If Firefox fixes the bug, they'll jump twice, but
+ // better twice than not at all, so make the fix hit future versions as
+ // well.
+ if ( isGecko ) {
+ $( function () {
+ if ( win.location.hash === fragment ) {
+ win.location.hash = fragment;
+ }
+ } );
+ }
+ }
+}, 'Use the module mediawiki.action.view.redirectToFragment instead.' );
+
+/**
+ * User-agent sniffing.
+ *
+ * @deprecated since 1.17 Use jquery.client instead
+ */
+
+msg = 'Use feature detection or module jquery.client instead.';
+
+mw.log.deprecate( win, 'clientPC', ua, msg );
+
+// Ignored dummy values
+mw.log.deprecate( win, 'is_gecko', false, msg );
+mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+mw.log.deprecate( win, 'is_chrome', false, msg );
+mw.log.deprecate( win, 'webkit_version', false, msg );
+mw.log.deprecate( win, 'is_safari_win', false, msg );
+mw.log.deprecate( win, 'is_safari', false, msg );
+mw.log.deprecate( win, 'webkit_match', false, msg );
+mw.log.deprecate( win, 'is_ff2', false, msg );
+mw.log.deprecate( win, 'ff2_bugs', false, msg );
+mw.log.deprecate( win, 'is_ff2_win', false, msg );
+mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+mw.log.deprecate( win, 'opera95_bugs', false, msg );
+mw.log.deprecate( win, 'opera7_bugs', false, msg );
+mw.log.deprecate( win, 'opera6_bugs', false, msg );
+mw.log.deprecate( win, 'is_opera_95', false, msg );
+mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+mw.log.deprecate( win, 'is_opera', false, msg );
+mw.log.deprecate( win, 'ie6_bugs', false, msg );
+
+/**
+ * DOM utilities for handling of events, text nodes and selecting elements
+ *
+ * @deprecated since 1.17 Use jQuery instead
+ */
+msg = 'Use jQuery instead.';
+
+// Ignored dummy values
+mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+mw.log.deprecate( win, 'onloadFuncts', [], msg );
+mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+mw.log.deprecate( win, 'changeText', $.noop, msg );
+mw.log.deprecate( win, 'killEvt', $.noop, msg );
+mw.log.deprecate( win, 'addHandler', $.noop, msg );
+mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
+
+// Run a function after the window onload event is fired
+mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
+ if ( onloadFuncts ) {
+ onloadFuncts.push(hookFunct);
+ } else {
+ // If func queue is gone the event has happened already,
+ // run immediately instead of queueing.
+ hookFunct();
+ }
+}, msg );
+
+$( win ).on( 'load', function () {
+ var i, functs;
+
+ // Don't run twice
+ if ( !onloadFuncts ) {
+ return;
+ }
+
+ // Deference and clear onloadFuncts before running any
+ // hooks to make sure we don't miss any addOnloadHook
+ // calls.
+ functs = onloadFuncts.slice();
+ onloadFuncts = undefined;
+
+ // Execute the queued functions
+ for ( i = 0; i < functs.length; i++ ) {
+ functs[i]();
+ }
+} );
+
+/**
+ * Toggle checkboxes with shift selection
+ *
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
+ */
+msg = 'Use jquery.checkboxShiftClick instead.';
+mw.log.deprecate( win, 'checkboxes', [], msg );
+mw.log.deprecate( win, 'lastCheckbox', null, msg );
+mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
+
+/**
+ * Add a button to the default editor toolbar
+ *
+ * @deprecated since 1.17 Use mw.toolbar instead
+ */
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
+
+/**
+ * Spinner creation, injection and removal
+ *
+ * @deprecated since 1.18 Use jquery.spinner instead
+ */
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
+
+/**
+ * Escape utilities
+ *
+ * @deprecated since 1.18 Use mw.html instead
+ */
+mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
+
+/**
+ * Display a message to the user
+ *
+ * @deprecated since 1.17 Use mediawiki.notify instead
+ * @param {string|HTMLElement} message To be put inside the message box
+ */
+mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' );
+
+/**
+ * Misc. utilities
+ *
+ * @deprecated since 1.17 Use mediawiki.util instead
+ */
+msg = 'Use mediawiki.util instead.';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
+mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+
+/**
+ * Wikipage import methods
+ */
+
+// included-scripts tracker
+win.loadedScripts = {};
+
+win.importScript = function ( page ) {
+ var uri = mw.config.get( 'wgScript' ) + '?title=' +
+ mw.util.wikiUrlencode( page ) +
+ '&action=raw&ctype=text/javascript';
+ return win.importScriptURI( uri );
+};
+
+win.importScriptURI = function ( url ) {
+ if ( win.loadedScripts[url] ) {
+ return null;
+ }
+ win.loadedScripts[url] = true;
+ var s = document.createElement( 'script' );
+ s.setAttribute( 'src', url );
+ s.setAttribute( 'type', 'text/javascript' );
+ document.getElementsByTagName( 'head' )[0].appendChild( s );
+ return s;
+};
+
+win.importStylesheet = function ( page ) {
+ var uri = mw.config.get( 'wgScript' ) + '?title=' +
+ mw.util.wikiUrlencode( page ) +
+ '&action=raw&ctype=text/css';
+ return win.importStylesheetURI( uri );
+};
+
+win.importStylesheetURI = function ( url, media ) {
+ var l = document.createElement( 'link' );
+ l.rel = 'stylesheet';
+ l.href = url;
+ if ( media ) {
+ l.media = media;
+ }
+ document.getElementsByTagName('head')[0].appendChild( l );
+ return l;
+};
+
+if ( isIE6 ) {
+ win.importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
+}
+
+}( mediaWiki, jQuery ) );
diff --git a/modern/audio.png b/modern/audio.png
new file mode 100644
index 0000000..68c8768
--- /dev/null
+++ b/modern/audio.png
Binary files differ
diff --git a/modern/bullet.gif b/modern/bullet.gif
new file mode 100644
index 0000000..b43de48
--- /dev/null
+++ b/modern/bullet.gif
Binary files differ
diff --git a/modern/discussionitem_icon.gif b/modern/discussionitem_icon.gif
new file mode 100644
index 0000000..e3ca6d9
--- /dev/null
+++ b/modern/discussionitem_icon.gif
Binary files differ
diff --git a/modern/document.png b/modern/document.png
new file mode 100644
index 0000000..ee46a50
--- /dev/null
+++ b/modern/document.png
Binary files differ
diff --git a/modern/external.png b/modern/external.png
new file mode 100644
index 0000000..6308383
--- /dev/null
+++ b/modern/external.png
Binary files differ
diff --git a/modern/file_icon.gif b/modern/file_icon.gif
new file mode 100644
index 0000000..69dbeaf
--- /dev/null
+++ b/modern/file_icon.gif
Binary files differ
diff --git a/modern/footer-grad.png b/modern/footer-grad.png
new file mode 100644
index 0000000..72b8724
--- /dev/null
+++ b/modern/footer-grad.png
Binary files differ
diff --git a/modern/link_icon.gif b/modern/link_icon.gif
new file mode 100644
index 0000000..168c1a2
--- /dev/null
+++ b/modern/link_icon.gif
Binary files differ
diff --git a/modern/lock_icon.gif b/modern/lock_icon.gif
new file mode 100644
index 0000000..8284403
--- /dev/null
+++ b/modern/lock_icon.gif
Binary files differ
diff --git a/modern/mail_icon.gif b/modern/mail_icon.gif
new file mode 100644
index 0000000..cf5680d
--- /dev/null
+++ b/modern/mail_icon.gif
Binary files differ
diff --git a/modern/main.css b/modern/main.css
new file mode 100644
index 0000000..6f73f0e
--- /dev/null
+++ b/modern/main.css
@@ -0,0 +1,912 @@
+body {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ font-size: x-small;
+
+
+ font-family: sans-serif;
+ color: black;
+ background-color: #f0f0f0;
+
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+#mw_main,
+#p-personal,
+#mw_header,
+.os-suggest {
+ font-size: 130%;
+}
+
+#mw_header {
+ position: absolute;
+ top: 0;
+ left: 0;
+ margin: 0 0 0 0;
+ padding: 0 0em 0 0em;
+ border: none;
+ height: 2em;
+ width: 100%;
+
+ background-color: #003366;
+ color: white;
+}
+
+#mw_header h1 {
+ margin: 0 0 0 0.5em;
+ padding: 0 0 0 0;
+ text-decoration: none;
+ font-size: 150%;
+}
+
+#p-personal {
+ position: absolute;
+ top: 2em;
+ left: 0;
+ height: 1.5em;
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ width: 100%;
+
+}
+
+#p-personal div.pBody {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ height: 1.5em;
+ font-variant: small-caps;
+}
+
+#p-personal h3 {
+ display: none;
+}
+
+#p-personal ul {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ display: block;
+ height: 1.5em;
+ background-color: #3c78b5;
+}
+
+#p-personal li {
+ display: block;
+ float: left;
+ height: 1.5em;
+ margin: 0 0 0 0;
+ vertical-align: middle;
+
+ font-weight: bold;
+ text-transform: lowercase;
+}
+
+#p-personal li a {
+ text-decoration: none;
+ color: white;
+ padding: 0 1em 0 1em;
+}
+
+#p-personal li a:hover {
+ text-decoration: none;
+ color: white;
+}
+
+#p-personal li:hover {
+ background-color: #003366;
+}
+
+#jump-to-nav {
+ display: none;
+}
+
+#mw_contentwrapper {
+ width: 100%;
+ margin: 0 0 0 -15em;
+ float: right;
+}
+
+#mw_content {
+ margin: 0 0 0 14em;
+
+ background-color: white;
+ border-top: solid 1px #bbbbbb;
+ border-left: solid 1px #bbbbbb;
+ border-bottom: solid 1px #bbbbbb;
+
+ line-height: 1.5em;
+ padding: 0 1em 1em 1em;
+}
+
+#mw_portlets {
+ width: 14em;
+
+ border-right: solid 1px #bbbbbb;
+ background-color: #f0f0f0;
+}
+
+/* Hide, but keep accessible for screen-readers */
+#mw_portlets h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+#mw_main {
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+ margin-top: 3.5em;
+}
+
+div.mw_clear {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ clear: both;
+}
+
+.portlet {
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+}
+
+.portlet div.pBody {
+ padding: 0em 0 0.5em 0;
+}
+
+textarea {
+ width: 100%;
+ padding: .1em;
+ display: block;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#searchBody {
+ text-align: center;
+}
+
+#searchInput {
+ width: 85%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+#p-search #searchform div div {
+ margin-top: .4em;
+}
+
+.portlet h3 {
+ padding: 0.1em 0 0.3em 1em;
+ margin: 0 0 0 0;
+ background-color: #dddddd;
+ font-weight: bold;
+ font-size: 0.83em;
+ border-bottom: solid 1px #3c78b5;
+ height: 1.1em;
+}
+
+.portlet ul {
+ margin: 0 0 0 1.5em;
+ padding: 0 0 0 0;
+}
+
+#mw_portlets .portlet ul {
+ line-height: 1.4em;
+}
+
+ul {
+ /* @embed */
+ list-style-image: url(bullet.gif);
+}
+
+#p-cactions {
+ height: 1.5em;
+ padding: 0 0 0 0;
+ margin: 0 0 0 14em;
+}
+
+#p-cactions div.pBody {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+}
+
+#p-cactions a,
+#p-cactions a:hover {
+ color: black;
+ text-decoration: none;
+}
+
+#p-cactions ul {
+ display: inline;
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+}
+
+#p-cactions li {
+ margin: 0 0.5em 0 0.5em;
+ padding: 0 0.2em 0 0.2em;
+ display: block;
+ float: left;
+ height: 1.5em;
+ text-transform: lowercase;
+}
+
+#p-cactions li.selected {
+ background-color: #bbbbbb;
+}
+
+#p-cactions li a,
+#p-cactions li a:hover,
+#p-cactions li a:visited {
+ text-decoration: underline;
+ color: #003366;
+}
+
+#p-cactions li.selected a,
+#p-cactions li.selected a:hover,
+#p-cactions li.selected a:visited {
+ text-decoration: none;
+ color: white;
+}
+
+#p-cactions h3 {
+ display: none;
+}
+
+#siteSub {
+ display: none;
+}
+
+#footer {
+ background-color: #f0f0f0;
+ /* @embed */
+ background: url(footer-grad.png) repeat-x 0 0;
+ padding: 10px 1em 1em 1em;
+ clear:both;
+ color: #444444;
+}
+
+#footer a,
+#footer a:hover,
+#footer a:visited {
+ color: #444444;
+ text-decoration: underline;
+}
+
+img {
+ border: none;
+}
+
+#footer li {
+ display: inline;
+ list-style-type: none;
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+}
+
+#footer ul {
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+}
+
+p {
+ margin: 1em 0 1em 0;
+}
+
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+#contentSub {
+ color: #545454;
+ font-size: small;
+ padding-left: 2em;
+}
+
+#mw_portlets form {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+}
+
+a {
+ text-decoration: none;
+ color: #003366;
+ background: none;
+}
+a:visited {
+ color: #5a3696;
+}
+a:active {
+ color: #faa700;
+}
+a:hover {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new {
+ color: #ba0000;
+}
+a.new:visited {
+ color: #a55858;
+}
+
+h1, h2 {
+ border-bottom: solid 1px #003366;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ overflow: hidden;
+}
+
+#preftoc {
+ width: 100%;
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ height: 1.5em;
+ clear: right;
+}
+
+#preftoc li {
+ margin: 0 0.5em 0 0.5em;
+ padding: 0 0.2em 0 0.2em;
+ display: block;
+ float: left;
+ height: 1.5em;
+ text-transform: lowercase;
+}
+
+#preferences {
+ margin: 0 0 0 0;
+ padding: 0em 1em 1em 1em;
+ border: solid 1px #bbbbbb;
+ clear: left; /* Multi-line toc should not push data to horizontally */
+}
+
+#preferences fieldset {
+ margin-top: 0;
+ border: none;
+}
+
+.mainLegend {
+ display: none;
+}
+
+.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
+
+.prefsection legend {
+ font-weight: bold;
+}
+
+#preftoc li.selected {
+ background-color: #bbbbbb;
+}
+
+#preftoc li a,
+#preftoc li a:hover,
+#preftoc li a:visited {
+ text-decoration: underline;
+ color: #003366;
+}
+
+#preftoc li.selected a,
+#preftoc li.selected a:hover,
+#preftoc li.selected a:visited {
+ text-decoration: none;
+ color: white;
+}
+#mw_content a.external {
+ /* @embed */
+ background: url(external.png) center right no-repeat;
+ padding-right: 13px;
+}
+#mw_content a.external[href ^="https://"],
+.link-https {
+ /* @embed */
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
+}
+#mw_content a.external[href ^="mailto:"],
+.link-mailto {
+ /* @embed */
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#mw_content a.external[href ^="news:"] {
+ /* @embed */
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
+}
+#mw_content a.external[href ^="ftp://"],
+.link-ftp {
+ /* @embed */
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#mw_content a.external[href ^="irc://"],
+#mw_content a.external[href ^="ircs://"],
+.link-irc {
+ /* @embed */
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+
+#mw_content a.external[href $=".ogg"], #mw_content a.external[href $=".OGG"],
+#mw_content a.external[href $=".mid"], #mw_content a.external[href $=".MID"],
+#mw_content a.external[href $=".midi"], #mw_content a.external[href $=".MIDI"],
+#mw_content a.external[href $=".mp3"], #mw_content a.external[href $=".MP3"],
+#mw_content a.external[href $=".wav"], #mw_content a.external[href $=".WAV"],
+#mw_content a.external[href $=".wma"], #mw_content a.external[href $=".WMA"],
+.link-audio {
+ /* @embed */
+ background: url(audio.png) center right no-repeat;
+ padding-right: 13px;
+}
+#mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"],
+#mw_content a.external[href $=".avi"], #mw_content a.external[href $=".AVI"],
+#mw_content a.external[href $=".mpeg"], #mw_content a.external[href $=".MPEG"],
+#mw_content a.external[href $=".mpg"], #mw_content a.external[href $=".MPG"],
+.link-video {
+ /* @embed */
+ background: url(video.png) center right no-repeat;
+ padding-right: 13px;
+}
+#mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"],
+#mw_content a.external[href *=".pdf#"], #mw_content a.external[href *=".PDF#"],
+#mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"],
+.link-document {
+ /* @embed */
+ background: url(document.png) center right no-repeat;
+ padding-right: 12px;
+}
+
+/* images */
+/* @noflip */div.floatright, table.floatright {
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatright p {
+ font-style: italic;
+}
+/* @noflip */div.floatleft, table.floatleft {
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatleft p {
+ font-style: italic;
+}
+
+/* thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ width: auto;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: right;
+ border: none !important;
+ background: none !important;
+ margin-left: 3px;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+/* @noflip */div.tright {
+ margin: .5em 0 .8em 1.4em;
+}
+/* @noflip */div.tleft {
+ margin: .5em 1.4em .8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+
+#toc,
+.toc {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+ border-spacing: 0;
+ background-color: #f0f0f0;
+ border: solid 1px #bbbbbb;
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earliers */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
+}
+
+#toc tr, #toc td {
+ margin: 0 0 0 0;
+ padding: 0 0 0 0;
+}
+
+#toctitle {
+ border-bottom: solid 1px #3c78b5;
+ background-color: #dddddd;
+ margin: 0 0 0 0;
+}
+
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0 1em 0 1em;
+ padding: 0;
+ text-align: left;
+}
+
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+
+.catlinks {
+ border: solid 1px #bbbbbb;
+ background-color: #f0f0f0;
+ padding: 0.1em 0.3em 0.1em 0.3em;
+ margin: 0 0 0 0;
+}
+
+#mw_header h1,
+#p-personal,
+#p-cactions {
+ overflow: hidden;
+}
+
+/* disable interwiki styling */
+#mw_content a.extiw,
+#mw_content a.extiw:active {
+ color: #36b;
+}
+#mw_content a.external {
+ color: #36b;
+}
+
+
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+
+.printfooter {
+ display: none;
+}
+
+.sharedUploadNotice {
+ font-style: italic;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #0f0;
+}
+
+.previewnote {
+ text-indent: 3em;
+ color: #c00;
+ border-bottom: 1px solid #aaa;
+ padding-bottom: 1em;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ margin: 0;
+ padding: 0;
+}
+
+.editExternally {
+ border: 1px solid gray;
+ background-color: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+.toggle {
+ margin-left: 2em;
+ text-indent: -2em;
+}
+
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+input#wpSummary {
+ width: 80%;
+}
+
+/* @bug 1714 */
+input#wpSave, input#wpDiff {
+ margin-right: 0.33em;
+}
+
+#wpSave {
+ font-weight: bold;
+}
+
+/* noarticletext */
+div.noarticletext {
+ border: 1px solid #ccc;
+ background: #fff;
+ padding: .2em 1em;
+ color: #000;
+}
+
+div#searchTargetContainer {
+ left: 10px;
+ top: 10px;
+ width: 90%;
+ background: white;
+}
+
+div#searchTarget {
+ padding: 3px;
+ margin: 5px;
+ background: #F0F0F0;
+ border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+ list-style: none;
+}
+
+div#searchTarget ul li:before {
+ color: orange;
+ content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+ float: right;
+ border: solid 1px black;
+ background: #DCDCDC;
+ padding: 2px;
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+.templatesUsed {
+ margin-top: 1.5em;
+}
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+ padding: 3px;
+ text-align: center;
+ margin: 3px auto;
+}
+div.mw-lag-warn-normal {
+ border: 1px solid #FFCC66;
+ background-color: #FFFFCC;
+}
+div.mw-lag-warn-high {
+ font-weight: bold;
+ border: 2px solid #FF0033;
+ background-color: #FFCCCC;
+}
+
+.MediaTransformError {
+ background-color: #ccc;
+ padding: 0.1em;
+}
+.MediaTransformError td {
+ text-align: center;
+ vertical-align: middle;
+ font-size: 90%;
+}
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.5em;
+ padding: 0;
+ /* @embed */
+ list-style-image: url(bullet.gif);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+
+#p-cactions li.new a {
+ color: #cc2200;
+}
+
+span.subpages {
+ font-size: 80%;
+ display: block;
+}
+
+pre, .mw-code {
+ border: solid 1px #3c78b5;
+ padding: 0.4em;
+ background-color: #f0f0f0;
+}
+
+.usermessage {
+ background-color: #dadaff;
+}
+
+.mw-topboxes {
+ border-collapse: collapse;
+ margin: 0 -1em 1em -1em;
+ padding: 0 0 8px 0;
+ /* @embed */
+ background: url(footer-grad.png) repeat-x bottom left;
+}
+
+.mw-topbox p {
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+}
+
+.mw-topbox {
+ color: black;
+ font-weight: bold;
+ margin: 0 0 0 0;
+ padding: 0 1em 0 1em;
+ vertical-align: middle;
+ border-collapse: collapse;
+ border-bottom: solid 1px #bbbbbb;
+}
+
+#siteSub {
+ background-color: #dddddd;
+}
+
+/* emulate center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* table standards */
+.toccolours {
+ border: 1px solid #bbbbbb;
+ background-color: #f0f0f0;
+ border-spacing: 0pt;
+ margin: 0pt;
+ padding: 0pt;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 130%;
+}
+
+/**
+ * Lists:
+ * The following lines don't have a visible effect on non-Gecko browsers
+ * They fix a problem ith Gecko browsers rendering lists to the right of
+ * left-floated objects in an RTL layout.
+ */
+/* @noflip */
+html > body.rtl div#mw_contentholder ul {
+ display: table;
+}
+
+/* @noflip */
+html > body.rtl div#mw_contentholder ul#filetoc {
+ display: block;
+}
diff --git a/modern/news_icon.png b/modern/news_icon.png
new file mode 100644
index 0000000..4d3cb47
--- /dev/null
+++ b/modern/news_icon.png
Binary files differ
diff --git a/modern/print.css b/modern/print.css
new file mode 100644
index 0000000..150d2d2
--- /dev/null
+++ b/modern/print.css
@@ -0,0 +1,10 @@
+#mw_portlets,
+#p-cactions,
+#p-personal,
+#jump-to-nav,
+#footer,
+.mw-editsection,
+.mw-editsection-like,
+.noprint {
+ display: none;
+}
diff --git a/modern/video.png b/modern/video.png
new file mode 100644
index 0000000..e535c0c
--- /dev/null
+++ b/modern/video.png
Binary files differ
diff --git a/monobook/IE60Fixes.css b/monobook/IE60Fixes.css
new file mode 100644
index 0000000..f3e4100
--- /dev/null
+++ b/monobook/IE60Fixes.css
@@ -0,0 +1,112 @@
+/* 6.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+div#column-content {
+ float: none;
+ margin-left: 0;
+ height: 1%;
+}
+div#column-content div#content {
+ margin-left: 12.2em;
+ margin-top: 3em;
+ height: 1%;
+}
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
+div#column-one {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 4;
+}
+.rtl div#column-one {
+ left: auto;
+ right: 0;
+}
+div#footer {
+ margin-left: 13.6em;
+ border-left: 1px solid #fabd23;
+}
+.rtl div#footer {
+ margin-left: 0;
+ margin-right: 13.6em;
+ border-left: none;
+ border-right: 1px solid #fabd23;
+}
+
+/* float/negative margin brokenness */
+* html div#footer {
+ margin-top: 0;
+}
+
+* html div#column-content {
+ display: inline;
+ margin-bottom: 0;
+}
+
+/* the tabs */
+
+#p-cactions {
+ z-index: 3;
+}
+
+#p-cactions li {
+ padding-bottom: 0 !important;
+ border: none;
+ background-color: transparent;
+ cursor: default;
+ float: none !important;
+}
+#p-cactions li a {
+ display: inline-block !important;
+ vertical-align: top;
+ padding-bottom: 0;
+ border: solid #aaa;
+ border-width: 1px 1px 0;
+}
+#p-cactions li.selected a {
+ border-color: #fabd23;
+ padding-bottom: 0.17em;
+}
+#p-cactions li a:hover {
+ padding-bottom: 0.17em;
+}
+#p-navigation a {
+ display: inline-block;
+ width: 100%;
+}
+#portal-personaltools {
+ padding-bottom: 0.1em;
+}
+
+.rtl a.feedlink {
+ background-position: right;
+ padding-right: 0;
+ padding-left: 16px;
+}
+
+/* show the hand */
+#p-logo a,
+#p-logo a:hover {
+ cursor: pointer;
+}
+div.visualClear {
+ width:100%;
+ line-height: 0;
+}
+textarea {
+ width: 96%;
+}
+
+#catlinks,
+div.tright,
+div.tleft {
+ position: relative;
+}
+
+/* bug 12846 */
+body.rtl #preftoc a, body.rtl #preftoc a:active {
+ float: left;
+}
diff --git a/monobook/IE70Fixes.css b/monobook/IE70Fixes.css
new file mode 100644
index 0000000..e8d3a8f
--- /dev/null
+++ b/monobook/IE70Fixes.css
@@ -0,0 +1,92 @@
+/* 7.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+
+/* This bit is needed to make links clickable... WTF */
+div#column-content div#content {
+ margin-left: 12.2em;
+ margin-top: 3em;
+ height: 1%;
+}
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
+
+
+.rtl div#column-one {
+ /* For some reason it tries to inherit the padding-top into every div,
+ * and I can't figure out how to get it back off.
+ * Margin works correctly for this use, though.
+ */
+ padding-top: 0;
+ margin-top: 160px;
+}
+
+/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
+ * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
+ * Also clear the right margin (originally margin-left: 1em)
+ */
+li#pt-userpage, li#pt-anonuserpage, li#pt-login {
+ padding-left: 20px;
+ margin-right: 0;
+}
+
+.rtl a.feedlink {
+ background-position: right;
+ padding-right: 0;
+ padding-left: 16px;
+}
+/* the tabs */
+
+#p-cactions {
+ z-index: 3;
+}
+
+
+#p-cactions li {
+ padding-bottom: 0 !important;
+ border: none;
+ background-color: transparent;
+ cursor: default;
+ float: none !important;
+}
+
+#p-cactions li a {
+ display: inline-block !important;
+ vertical-align: top;
+ padding-bottom: 0;
+ border: solid #aaa;
+ border-width: 1px 1px 0;
+}
+#p-cactions li.selected a {
+ border-color: #fabd23;
+ padding-bottom: 0.17em;
+}
+#p-cactions li a:hover {
+ padding-bottom: 0.17em;
+}
+#p-navigation a {
+ display: inline-block;
+ width: 100%;
+}
+#portal-personaltools {
+ padding-bottom: 0.1em;
+}
+textarea {
+ width: 96%;
+}
+
+/*
+#catlinks,
+div.tright,
+div.tleft {
+ position: relative;
+}
+*/
+
+
+div#footer li {
+ /* Work around bug with inline <li> tags with right margins and nowrap */
+ margin-right: 0;
+}
diff --git a/monobook/audio.png b/monobook/audio.png
new file mode 100644
index 0000000..68c8768
--- /dev/null
+++ b/monobook/audio.png
Binary files differ
diff --git a/monobook/bullet.gif b/monobook/bullet.gif
new file mode 100644
index 0000000..b43de48
--- /dev/null
+++ b/monobook/bullet.gif
Binary files differ
diff --git a/monobook/discussionitem_icon.gif b/monobook/discussionitem_icon.gif
new file mode 100644
index 0000000..e3ca6d9
--- /dev/null
+++ b/monobook/discussionitem_icon.gif
Binary files differ
diff --git a/monobook/document.png b/monobook/document.png
new file mode 100644
index 0000000..ee46a50
--- /dev/null
+++ b/monobook/document.png
Binary files differ
diff --git a/monobook/external-ltr.png b/monobook/external-ltr.png
new file mode 100644
index 0000000..6308383
--- /dev/null
+++ b/monobook/external-ltr.png
Binary files differ
diff --git a/monobook/external-rtl.png b/monobook/external-rtl.png
new file mode 100644
index 0000000..5313234
--- /dev/null
+++ b/monobook/external-rtl.png
Binary files differ
diff --git a/monobook/file_icon.gif b/monobook/file_icon.gif
new file mode 100644
index 0000000..69dbeaf
--- /dev/null
+++ b/monobook/file_icon.gif
Binary files differ
diff --git a/monobook/headbg.jpg b/monobook/headbg.jpg
new file mode 100644
index 0000000..5491c6e
--- /dev/null
+++ b/monobook/headbg.jpg
Binary files differ
diff --git a/monobook/link_icon.gif b/monobook/link_icon.gif
new file mode 100644
index 0000000..168c1a2
--- /dev/null
+++ b/monobook/link_icon.gif
Binary files differ
diff --git a/monobook/lock_icon.gif b/monobook/lock_icon.gif
new file mode 100644
index 0000000..f71cd9b
--- /dev/null
+++ b/monobook/lock_icon.gif
Binary files differ
diff --git a/monobook/magnify-clip.png b/monobook/magnify-clip.png
new file mode 100644
index 0000000..ffd7637
--- /dev/null
+++ b/monobook/magnify-clip.png
Binary files differ
diff --git a/monobook/mail_icon.gif b/monobook/mail_icon.gif
new file mode 100644
index 0000000..cf5680d
--- /dev/null
+++ b/monobook/mail_icon.gif
Binary files differ
diff --git a/monobook/main.css b/monobook/main.css
new file mode 100644
index 0000000..c32e869
--- /dev/null
+++ b/monobook/main.css
@@ -0,0 +1,835 @@
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+div#column-content {
+ width: 100%;
+ float: right;
+ margin: 0 0 .6em -12.2em;
+ padding: 0;
+}
+div#content {
+ margin: 2.8em 0 0 12.2em;
+ padding: 1em;
+ position: relative;
+ z-index: 2;
+}
+div#column-one {
+ padding-top: 160px;
+}
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+ position: absolute;
+ top: -9999px;
+}
+div#content {
+ background: white;
+ color: black;
+ border: 1px solid #aaa;
+ border-right: none;
+ line-height: 1.5em;
+}
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+body {
+ font: x-small sans-serif;
+ /* @embed */
+ background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+ color: black;
+ margin: 0;
+ padding: 0;
+ direction: ltr; /* Needed for RTL flipping */
+ unicode-bidi: embed;
+}
+
+/* scale back up to a sane default */
+div#globalWrapper {
+ font-size: 127%;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+/* general styles */
+a {
+ color: #002bb8;
+}
+a:visited {
+ color: #5a3696;
+}
+a.new,
+#p-personal a.new {
+ color: #cc2200;
+}
+
+ul {
+ list-style-type: square;
+ /* @embed */
+ list-style-image: url(bullet.gif);
+}
+
+input.historysubmit {
+ padding: 0 .3em .3em .3em !important;
+ font-size: 94%;
+ cursor: pointer;
+ height: 1.7em !important;
+ margin-left: 1.6em;
+}
+
+pre, .mw-code {
+ line-height: 1.1em;
+}
+
+#firstHeading {
+ padding-top: 0;
+}
+/*
+** the main content area
+*/
+
+#siteNotice {
+ font-size: 95%;
+ padding: 0 0.9em;
+}
+#localNotice {
+ margin: 0;
+}
+#siteNotice p {
+ margin: 0;
+ padding: 0;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+ float: right;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+ line-height: 1.4em;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external {
+ /* @embed */
+ background: url(external-ltr.png) center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href ^="https://"],
+.link-https {
+ /* @embed */
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
+}
+#bodyContent a.external[href ^="mailto:"],
+.link-mailto {
+ /* @embed */
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href ^="news:"] {
+ /* @embed */
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href ^="ftp://"],
+.link-ftp {
+ /* @embed */
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href ^="irc://"],
+#bodyContent a.external[href ^="ircs://"],
+.link-irc {
+ /* @embed */
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+ /* @embed */
+ background: url(audio.png) center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+ /* @embed */
+ background: url(video.png) center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+ /* @embed */
+ background: url(document.png) center right no-repeat;
+ padding-right: 12px;
+}
+
+/* Interwiki Styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+ color: #36b;
+}
+
+/* External links */
+#bodyContent a.external {
+ color: #36b;
+}
+
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+ border: none;
+ margin: 0 0 .5em;
+ padding: 0;
+ float: none;
+ width: 11.6em;
+ overflow: hidden;
+}
+.portlet h3 {
+ background: transparent;
+ padding: 0 1em 0 .5em;
+ display: inline;
+ height: 1em;
+ text-transform: lowercase;
+ font-size: 91%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.pBody {
+ font-size: 95%;
+ background-color: white;
+ color: black;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ padding: 0 .8em .3em .5em;
+}
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+ content: '';
+ clear: both;
+ display: block;
+}
+.portlet ul {
+ line-height: 1.5em;
+ font-size: 95%;
+}
+.portlet li {
+ padding: 0;
+ margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+#p-logo {
+ top: 0;
+ left: 0;
+ position: absolute; /*needed to use z-index */
+ z-index: 3;
+ height: 155px;
+ width: 12em;
+ overflow: visible;
+}
+#p-logo h3 {
+ display: none;
+}
+#p-logo a,
+#p-logo a:hover {
+ display: block;
+ height: 155px;
+ width: 12.2em;
+ background-repeat: no-repeat;
+ background-position: 35% 50% !important;
+ text-decoration: none;
+}
+
+/*
+** Search portlet
+*/
+#p-search {
+ position: relative;
+ z-index: 3;
+}
+input.searchButton {
+ margin-top: 1px;
+ font-size: 95%;
+}
+#searchGoButton {
+ padding-left: .5em;
+ padding-right: .5em;
+ font-weight: bold;
+}
+#searchInput {
+ width: 10.9em;
+ margin: 0;
+ font-size: 95%;
+}
+#p-search .pBody {
+ padding: .5em .4em .4em .4em;
+ text-align: center;
+}
+#p-search #searchform div div {
+ margin-top: .4em;
+ font-size: 95%;
+}
+/*
+** the personal toolbar
+*/
+#p-personal {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 3;
+}
+#p-personal {
+ width: 100%;
+ white-space: nowrap;
+ padding: 0;
+ margin: 0;
+ border: none;
+ background: none;
+ overflow: visible;
+ line-height: 1.2em;
+}
+#p-personal h3 {
+ display: none;
+}
+#p-personal .portlet,
+#p-personal .pBody {
+ z-index: 0;
+ padding: 0;
+ margin: 0;
+ border: none;
+ overflow: visible;
+ background: none;
+}
+/* this is the ul contained in the portlet */
+#p-personal ul {
+ border: none;
+ line-height: 1.4em;
+ color: #2f6fab;
+ padding: 0 2em 0 3em;
+ margin: 0;
+ text-align: right;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 0;
+ background: none;
+ cursor: default;
+}
+#p-personal li {
+ z-index: 0;
+ border: none;
+ padding: 0;
+ display: inline;
+ color: #2f6fab;
+ margin-left: 1em;
+ line-height: 1.2em;
+ background: none;
+}
+#p-personal li a {
+ text-decoration: none;
+ color: #005896;
+ padding-bottom: .2em;
+ background: none;
+}
+#p-personal li a:hover {
+ background-color: white;
+ padding-bottom: .2em;
+ text-decoration: none;
+}
+#p-personal li.active a:hover {
+ background-color: transparent;
+}
+/* The icon in front of the username / login link */
+li#pt-userpage,
+li#pt-anonuserpage,
+li#pt-login {
+ /* @embed */
+ background: url(user.gif) top left no-repeat;
+ padding-left: 20px;
+}
+#p-personal ul {
+ text-transform: lowercase;
+}
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+ text-transform: none;
+}
+#p-personal li.active {
+ font-weight: bold;
+}
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions {
+ position: absolute;
+ top: 1.3em;
+ left: 11.5em;
+ margin: 0;
+ white-space: nowrap;
+ width: 76%;
+ line-height: 1.1em;
+ overflow: visible;
+ background: none;
+ border-collapse: collapse;
+ padding-left: 1em;
+ font-size: 95%;
+}
+#p-cactions ul {
+ list-style-type: none;
+ list-style-image: none;
+}
+#p-cactions li {
+ display: inline;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ padding: 0 0 1em 0;
+ margin: 0 .3em 0 0;
+ overflow: visible;
+ background: white;
+}
+#p-cactions li.selected {
+ border-color: #fabd23;
+ font-weight: bold;
+}
+#p-cactions li a {
+ background-color: #fbfbfb;
+ color: #002bb8;
+ border: none;
+ padding: 0 .8em .3em;
+ position: relative;
+ z-index: 0;
+ margin: 0;
+ text-decoration: none;
+}
+#p-cactions li.selected a {
+ z-index: 3;
+ background-color: white;
+}
+#p-cactions .new a {
+ color: #ba0000;
+}
+#p-cactions li a:hover {
+ z-index: 3;
+ text-decoration: none;
+ background-color: white;
+}
+#p-cactions h3 {
+ display: none;
+}
+#p-cactions li.istalk {
+ margin-right: 0;
+}
+#p-cactions li.istalk a {
+ padding-right: .5em;
+}
+#p-cactions #ca-addsection a {
+ padding-left: .4em;
+ padding-right: .4em;
+}
+/* offsets to distinguish the tab groups */
+li#ca-talk {
+ margin-right: 1.6em;
+}
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
+ margin-left: 1.6em;
+}
+#p-cactions .pBody {
+ font-size: 1em;
+ background-color: transparent;
+ color: inherit;
+ border-collapse: inherit;
+ border: 0;
+ padding: 0;
+}
+#p-cactions li a {
+ text-transform: lowercase;
+}
+
+#p-lang {
+ position: relative;
+ z-index: 3;
+}
+
+/* Override text-transform on languages where capitalization is significant */
+.capitalize-all-nouns .portlet h3,
+.capitalize-all-nouns #p-personal ul,
+.capitalize-all-nouns #p-cactions ul li a {
+ text-transform: none;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+ color: #999;
+}
+/*
+** footer
+*/
+div#footer {
+ background-color: white;
+ border-top: 1px solid #fabd23;
+ border-bottom: 1px solid #fabd23;
+ margin: .6em 0 1em 0;
+ overflow: hidden;
+ padding: .4em 0 .3em 0;
+ text-align: center;
+ font-size: 90%;
+}
+div#footer li {
+ display: inline;
+ margin: 0 1.3em;
+}
+#f-poweredbyico, #f-copyrightico {
+ margin: 0 8px;
+ position: relative;
+ top: -2px; /* Bump it up just a tad */
+}
+#f-poweredbyico {
+ float: right;
+ height: 1%;
+}
+#f-copyrightico {
+ float: left;
+ height: 1%;
+}
+
+.mw-htmlform-submit {
+ font-weight: bold;
+ padding-left: .3em;
+ padding-right: .3em;
+ margin-right: 2em;
+}
+
+/* js pref toc */
+#preftoc {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ clear: both;
+}
+#preftoc li {
+ background-color: #f0f0f0;
+ color: #000;
+}
+#preftoc li {
+ margin: 1px -2px 1px 2px;
+ float: left;
+ padding: 2px 0 3px 0;
+ border: 1px solid #fff;
+ border-right-color: #716f64;
+ border-bottom: 0;
+ position: relative;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 3;
+}
+#preftoc li.selected {
+ font-weight: bold;
+ background-color: #f9f9f9;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ cursor: default;
+ top: 1px;
+ padding-top: 2px;
+ margin-right: -3px;
+}
+#preftoc > li.selected {
+ top: 2px;
+}
+#preftoc a,
+#preftoc a:active {
+ display: block;
+ color: #000;
+ padding: 0 .7em;
+ position: relative;
+ text-decoration: none;
+}
+#preftoc li.selected a {
+ cursor: default;
+ text-decoration: none;
+}
+#preferences {
+ margin: 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em;
+ background-color: #F9F9F9;
+}
+.prefsection {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+
+.prefsection legend {
+ font-weight: bold;
+}
+.prefsection table, .prefsection legend {
+ background-color: #F9F9F9;
+}
+.mainLegend {
+ display: none;
+}
+td.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
+
+.preferences-login {
+ clear: both;
+ margin-bottom: 1.5em;
+}
+
+.prefcache {
+ font-size: 90%;
+ margin-top: 2em;
+}
+
+#userloginprompt, #languagelinks {
+ font-size: 85%;
+}
+
+#login-sectiontip {
+ font-size: 85%;
+ line-height: 1.2;
+ padding-top: 2em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+ font-weight: bold;
+}
+
+/**
+ * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
+ * with the commit message "tweaks to page history".
+ * Unlike the other IE/Mac fixes that used to be present here, this seems to get
+ * applied on more modern browsers, so let's keep it here until someone has the
+ * time to properly test it out.
+ */
+#pagehistory li.selected {
+ position: relative;
+}
+
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+
+div.patrollink {
+ clear: both;
+}
+
+.sharedUploadNotice {
+ font-style: italic;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #0f0;
+}
+
+.editExternally {
+ border: 1px solid gray;
+ background-color: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+.toggle {
+ margin-left: 2em;
+ text-indent: -2em;
+}
+
+/* @bug 1714 */
+input#wpSave,
+input#wpDiff {
+ margin-right: 0.33em;
+}
+
+#wpSave {
+ font-weight: bold;
+}
+
+/* noarticletext */
+div.noarticletext {
+ border: 1px solid #ccc;
+ background: #fff;
+ padding: .2em 1em;
+ color: #000;
+}
+
+div#searchTargetContainer {
+ left: 10px;
+ top: 10px;
+ width: 90%;
+ background: white;
+}
+
+div#searchTarget {
+ padding: 3px;
+ margin: 5px;
+ background: #F0F0F0;
+ border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+ list-style-type: none;
+ list-style-image: none;
+}
+
+div#searchTarget ul li:before {
+ color: orange;
+ content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+ float: right;
+ border: solid 1px black;
+ background: #DCDCDC;
+ padding: 2px;
+}
+
+#powersearch p {
+ margin-top: 0;
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+.templatesUsed {
+ margin-top: 1.5em;
+}
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+ padding: 3px;
+ text-align: center;
+ margin: 3px auto;
+}
+div.mw-lag-warn-normal {
+ border: 1px solid #FFCC66;
+ background-color: #FFFFCC;
+}
+div.mw-lag-warn-high {
+ font-weight: bold;
+ border: 2px solid #FF0033;
+ background-color: #FFCCCC;
+}
+
+.MediaTransformError {
+ background-color: #ccc;
+ padding: 0.1em;
+}
+.MediaTransformError td {
+ text-align: center;
+ vertical-align: middle;
+ font-size: 90%;
+}
+
+/* God-damned hack for the crappy layout */
+.os-suggest {
+ font-size: 127%;
+}
+
+/* Sometimes people don't want personal tools to be lowercase! */
+.no-text-transform {
+ text-transform: none;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+ font-size: 127%;
+}
+
+/* mediawiki.notification */
+.skin-monobook .mw-notification {
+ -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
+}
diff --git a/monobook/news_icon.png b/monobook/news_icon.png
new file mode 100644
index 0000000..4d3cb47
--- /dev/null
+++ b/monobook/news_icon.png
Binary files differ
diff --git a/monobook/required.gif b/monobook/required.gif
new file mode 100644
index 0000000..bd71976
--- /dev/null
+++ b/monobook/required.gif
Binary files differ
diff --git a/monobook/user.gif b/monobook/user.gif
new file mode 100644
index 0000000..34b4839
--- /dev/null
+++ b/monobook/user.gif
Binary files differ
diff --git a/monobook/video.png b/monobook/video.png
new file mode 100644
index 0000000..d86dbe0
--- /dev/null
+++ b/monobook/video.png
Binary files differ
diff --git a/monobook/wiki-indexed.png b/monobook/wiki-indexed.png
new file mode 100644
index 0000000..799ebac
--- /dev/null
+++ b/monobook/wiki-indexed.png
Binary files differ
diff --git a/monobook/wiki.png b/monobook/wiki.png
new file mode 100644
index 0000000..8c42118
--- /dev/null
+++ b/monobook/wiki.png
Binary files differ
diff --git a/vector/collapsibleNav.js b/vector/collapsibleNav.js
new file mode 100644
index 0000000..45258e5
--- /dev/null
+++ b/vector/collapsibleNav.js
@@ -0,0 +1,152 @@
+/**
+ * Collapsible navigation for Vector
+ */
+( function ( mw, $ ) {
+ 'use strict';
+ var map;
+
+ // Use the same function for all navigation headings - don't repeat
+ function toggle( $element ) {
+ var isCollapsed = $element.parent().is( '.collapsed' );
+
+ $.cookie(
+ 'vector-nav-' + $element.parent().attr( 'id' ),
+ isCollapsed,
+ { 'expires': 30, 'path': '/' }
+ );
+
+ $element
+ .parent()
+ .toggleClass( 'expanded' )
+ .toggleClass( 'collapsed' )
+ .find( '.body' )
+ .slideToggle( 'fast' );
+ isCollapsed = !isCollapsed;
+
+ $element
+ .find( '> a' )
+ .attr( {
+ 'aria-pressed': isCollapsed ? 'false' : 'true',
+ 'aria-expanded': isCollapsed ? 'false' : 'true'
+ } );
+ }
+
+ /* Browser Support */
+
+ map = {
+ // Left-to-right languages
+ ltr: {
+ // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
+ opera: [['>=', 9.6]],
+ konqueror: [['>=', 4.0]],
+ blackberry: false,
+ ipod: false,
+ iphone: false,
+ ps3: false
+ },
+ // Right-to-left languages
+ rtl: {
+ opera: [['>=', 9.6]],
+ konqueror: [['>=', 4.0]],
+ blackberry: false,
+ ipod: false,
+ iphone: false,
+ ps3: false
+ }
+ };
+ if ( !$.client.test( map ) ) {
+ return true;
+ }
+
+ $( function ( $ ) {
+ var $headings, tabIndex;
+
+ /* General Portal Modification */
+
+ // Always show the first portal
+ $( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
+ // Apply a class to the entire panel to activate styles
+ $( '#mw-panel' ).addClass( 'collapsible-nav' );
+ // Use cookie data to restore preferences of what to show and hide
+ $( '#mw-panel > .portal:not(.persistent)' )
+ .each( function ( i ) {
+ var id = $(this).attr( 'id' ),
+ state = $.cookie( 'vector-nav-' + id );
+ $(this).find( 'ul:first' ).attr( 'id', id + '-list' );
+ // Add anchor tag to heading for better accessibility
+ $( this ).find( 'h3' ).wrapInner(
+ $( '<a>' )
+ .attr( {
+ href: '#',
+ 'aria-haspopup': 'true',
+ 'aria-controls': id + '-list',
+ role: 'button'
+ } )
+ .click( false )
+ );
+ // In the case that we are not showing the new version, let's show the languages by default
+ if (
+ state === 'true' ||
+ ( state === null && i < 1 ) ||
+ ( state === null && id === 'p-lang' )
+ ) {
+ $(this)
+ .addClass( 'expanded' )
+ .removeClass( 'collapsed' )
+ .find( '.body' )
+ .hide() // bug 34450
+ .show();
+ $(this).find( 'h3 > a' )
+ .attr( {
+ 'aria-pressed': 'true',
+ 'aria-expanded': 'true'
+ } );
+ } else {
+ $(this)
+ .addClass( 'collapsed' )
+ .removeClass( 'expanded' );
+ $(this).find( 'h3 > a' )
+ .attr( {
+ 'aria-pressed': 'false',
+ 'aria-expanded': 'false'
+ } );
+ }
+ // Re-save cookie
+ if ( state !== null ) {
+ $.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
+ }
+ } );
+
+ /* Tab Indexing */
+
+ $headings = $( '#mw-panel > .portal:not(.persistent) > h3' );
+
+ // Get the highest tab index
+ tabIndex = $( document ).lastTabIndex() + 1;
+
+ // Fix the search not having a tabindex
+ $( '#searchInput' ).attr( 'tabindex', tabIndex++ );
+
+ // Make it keyboard accessible
+ $headings.attr( 'tabindex', function () {
+ return tabIndex++;
+ });
+
+ // Toggle the selected menu's class and expand or collapse the menu
+ $( '#mw-panel' )
+ .delegate( '.portal:not(.persistent) > h3', 'keydown', function ( e ) {
+ // Make the space and enter keys act as a click
+ if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
+ toggle( $(this) );
+ }
+ } )
+ .delegate( '.portal:not(.persistent) > h3', 'mousedown', function ( e ) {
+ if ( e.which !== 3 ) { // Right mouse click
+ toggle( $(this) );
+ $(this).blur();
+ }
+ return false;
+ } );
+ });
+
+}( mediaWiki, jQuery ) );
diff --git a/vector/collapsibleTabs.js b/vector/collapsibleTabs.js
new file mode 100644
index 0000000..0e49744
--- /dev/null
+++ b/vector/collapsibleTabs.js
@@ -0,0 +1,208 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+ var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+ $.fn.collapsibleTabs = function ( options ) {
+ // return if the function is called on an empty jquery object
+ if ( !this.length ) {
+ return this;
+ }
+ // Merge options into the defaults
+ var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+ this.each( function () {
+ var $el = $( this );
+ // add the element to our array of collapsible managers
+ $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+ $el : $.collapsibleTabs.instances.add( $el ) );
+ // attach the settings to the elements
+ $el.data( 'collapsibleTabsSettings', $settings );
+ // attach data to our collapsible elements
+ $el.children( $settings.collapsible ).each( function () {
+ $.collapsibleTabs.addData( $( this ) );
+ } );
+ } );
+
+ // if we haven't already bound our resize handler, bind it now
+ if ( !$.collapsibleTabs.boundEvent ) {
+ $( window ).on( 'resize', $.debounce( 500, function () {
+ $.collapsibleTabs.handleResize();
+ } ) );
+ $.collapsibleTabs.boundEvent = true;
+ }
+
+ // call our resize handler to setup the page
+ $.collapsibleTabs.handleResize();
+ return this;
+ };
+ /**
+ * Returns the amount of horizontal distance between the two tabs groups
+ * (#left-navigation and #right-navigation), in pixels. If negative, this
+ * means that the tabs overlap, and the value is the width of overlapping
+ * parts.
+ *
+ * Used in default expandCondition and collapseCondition.
+ *
+ * @return {Numeric} distance/overlap in pixels
+ */
+ function calculateTabDistance() {
+ var $leftTab, $rightTab, leftEnd, rightStart;
+
+ // In RTL, #right-navigation is actually on the left and vice versa.
+ // Hooray for descriptive naming.
+ if ( !rtl ) {
+ $leftTab = $( '#left-navigation' );
+ $rightTab = $( '#right-navigation' );
+ } else {
+ $leftTab = $( '#right-navigation' );
+ $rightTab = $( '#left-navigation' );
+ }
+
+ leftEnd = $leftTab.offset().left + $leftTab.width();
+ rightStart = $rightTab.offset().left;
+
+ return rightStart - leftEnd;
+ }
+ $.collapsibleTabs = {
+ instances: [],
+ boundEvent: null,
+ defaults: {
+ expandedContainer: '#p-views ul',
+ collapsedContainer: '#p-cactions ul',
+ collapsible: 'li.collapsible',
+ shifting: false,
+ expandCondition: function ( eleWidth ) {
+ // If there are at least eleWidth + 1 pixels of free space, expand.
+ // We add 1 because .width() will truncate fractional values
+ // but .offset() will not.
+ return calculateTabDistance() >= (eleWidth + 1);
+ },
+ collapseCondition: function () {
+ // If there's an overlap, collapse.
+ return calculateTabDistance() < 0;
+ }
+ },
+ addData: function ( $collapsible ) {
+ var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+ if ( $settings ) {
+ $collapsible.data( 'collapsibleTabsSettings', {
+ expandedContainer: $settings.expandedContainer,
+ collapsedContainer: $settings.collapsedContainer,
+ expandedWidth: $collapsible.width(),
+ prevElement: $collapsible.prev()
+ } );
+ }
+ },
+ getSettings: function ( $collapsible ) {
+ var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ if ( !$settings ) {
+ $.collapsibleTabs.addData( $collapsible );
+ $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ }
+ return $settings;
+ },
+ handleResize: function () {
+ $.collapsibleTabs.instances.each( function () {
+ var $el = $( this ),
+ data = $.collapsibleTabs.getSettings( $el );
+
+ if ( data.shifting ) {
+ return;
+ }
+
+ // if the two navigations are colliding
+ if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+ $el.trigger( 'beforeTabCollapse' );
+ // move the element to the dropdown menu
+ $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+ }
+
+ // if there are still moveable items in the dropdown menu,
+ // and there is sufficient space to place them in the tab container
+ if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+ data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+ data.collapsible + ':first' ) ).expandedWidth ) ) {
+ //move the element from the dropdown to the tab
+ $el.trigger( 'beforeTabExpand' );
+ $.collapsibleTabs
+ .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+ }
+ } );
+ },
+ moveToCollapsed: function ( ele ) {
+ var outerData, expContainerSettings, target,
+ $moving = $( ele );
+
+ outerData = $.collapsibleTabs.getSettings( $moving );
+ if ( !outerData ) {
+ return;
+ }
+ expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // Remove the element from where it's at and put it in the dropdown menu
+ target = outerData.collapsedContainer;
+ $moving.css( 'position', 'relative' )
+ .css( ( rtl ? 'left' : 'right' ), 0 )
+ .animate( { width: '1px' }, 'normal', function () {
+ var data, expContainerSettings;
+ $( this ).hide();
+ // add the placeholder
+ $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+ $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
+ $( this ).attr( 'style', 'display: list-item;' );
+ data = $.collapsibleTabs.getSettings( $( ele ) );
+ if ( data ) {
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } );
+ },
+ moveToExpanded: function ( ele ) {
+ var data, expContainerSettings, $target, expandedWidth,
+ $moving = $( ele );
+
+ data = $.collapsibleTabs.getSettings( $moving );
+ if ( !data ) {
+ return;
+ }
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // grab the next appearing placeholder so we can use it for replacing
+ $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+ expandedWidth = data.expandedWidth;
+ $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+ $target.replaceWith(
+ $moving
+ .detach()
+ .css( 'width', '1px' )
+ .data( 'collapsibleTabsSettings', data )
+ .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+ $( this ).attr( 'style', 'display: block;' );
+ var data, expContainerSettings;
+ data = $.collapsibleTabs.getSettings( $( this ) );
+ if ( data ) {
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } )
+ );
+ }
+ };
+
+}( jQuery ) );
diff --git a/vector/components/animations.less b/vector/components/animations.less
new file mode 100644
index 0000000..9163779
--- /dev/null
+++ b/vector/components/animations.less
@@ -0,0 +1,28 @@
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+ div#content,
+ div#footer,
+ #left-navigation {
+ .transition(margin-left 250ms, padding 250ms;);
+ }
+
+ #p-logo {
+ .transition(left 250ms);
+ }
+
+ #mw-panel {
+ .transition(padding-right 250ms);
+ }
+
+ #p-search {
+ .transition(margin-right 250ms);
+ }
+
+ #p-personal {
+ .transition(right 250ms);
+ }
+
+ #mw-head-base {
+ .transition(margin-left 250ms);
+ }
+}
diff --git a/vector/components/collapsibleNav.less b/vector/components/collapsibleNav.less
new file mode 100644
index 0000000..e6f5c9a
--- /dev/null
+++ b/vector/components/collapsibleNav.less
@@ -0,0 +1,91 @@
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+ .portal {
+ background-position: left top;
+ background-repeat: no-repeat;
+ .background-image('images/portal-break.png');
+ padding: 0.25em 0 !important;
+ margin: -11px 9px 10px 11px;
+
+ h3 {
+ font-size: @menu-main-heading-font-size;
+ color: @collapsible-nav-heading-color;
+ font-weight: normal;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+ padding: @collapsible-nav-heading-padding;
+ margin-bottom: 0;
+
+ &:hover {
+ cursor: pointer;
+ text-decoration: none;
+ }
+
+ a {
+ color: @collapsible-nav-heading-color;
+ text-decoration: none;
+ }
+ }
+
+ .body {
+ margin: @collapsible-nav-body-margin;
+ background-image: none !important;
+ padding-top: 0;
+ display: none;
+
+ ul {
+ li {
+ padding: 0.25em 0;
+ }
+ }
+ }
+
+
+ /* First */
+ &.first {
+ background-image: none;
+ margin-top: 0;
+ h3 {
+ display: none;
+ }
+ }
+
+ /* Persistent */
+ &.persistent {
+ .body {
+ display: block;
+ margin-left: 0.5em;
+ }
+
+ h3 {
+ background-image: none !important;
+ padding-left: 0.7em;
+ cursor: default;
+ }
+ }
+
+ /* Collapsed */
+ &.collapsed {
+ h3 {
+ color: @collapsible-nav-heading-collapsed-color;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+ margin-bottom: 0;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ a {
+ color: @collapsible-nav-heading-collapsed-color;
+ }
+ }
+ }
+ }
+}
diff --git a/vector/components/common.less b/vector/components/common.less
new file mode 100644
index 0000000..25ba301
--- /dev/null
+++ b/vector/components/common.less
@@ -0,0 +1,141 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+ font-size: @html-font-size;
+}
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: @content-font-family;
+}
+body {
+ background-color: @menu-background-color;
+}
+
+/* Content */
+div#content {
+ margin-left: 10em;
+ padding: @content-padding;
+ /* Border on top, left, and bottom side */
+ border: 1px solid @content-border-color;
+ border-right-width: 0;
+ /* Merge the border with tabs' one (in their background image) */
+ margin-top: -1px;
+ background-color: @body-background-color;
+ color: @content-font-color;
+ direction: ltr;
+
+ .mw-editsection,
+ .mw-editsection-like {
+ font-family: @content-font-family;
+ }
+
+ p {
+ line-height: inherit;
+ margin: 0.5em 0;
+ }
+
+ h1,
+ h2,
+ #firstHeading {
+ font-family: @content-heading-font-family;
+ line-height: @heading-line-height;
+ margin-bottom: 0.25em;
+ padding: 0;
+ }
+
+ h1,
+ #firstHeading {
+ font-size: @content-heading-font-size;
+ }
+
+ h2 {
+ font-size: 1.5em;
+ margin-top: 1em;
+ }
+
+ h3,
+ h4,
+ h5,
+ h6 {
+ line-height: @content-line-height;
+ margin-top: 0.3em;
+ margin-bottom: 0;
+ padding-bottom: 0;
+ }
+
+ h3 {
+ font-size: 1.17em;
+ }
+
+ h3,
+ h4 {
+ font-weight: bold;
+ }
+
+ h4,
+ h5,
+ h6 {
+ font-size: 100%; /* (reset) */
+ }
+
+ #toc h2,
+ .toc h2 {
+ font-size: 100%; /* (reset) */
+ font-family: @content-font-family;
+ }
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+ display: none;
+}
+
+ul {
+ list-style-type: disc;
+ .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+ line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ font-size: 0.8em;
+}
+
+.redirectText {
+ font-size: 140%;
+}
+
+.redirectMsg img {
+ vertical-align: text-bottom;
+}
+
+#bodyContent {
+ position: relative;
+ width: 100%;
+ line-height: @content-line-height;
+ font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+ font-size: 0.8em;
+}
diff --git a/vector/components/externalLinks.less b/vector/components/externalLinks.less
new file mode 100644
index 0000000..91388c6
--- /dev/null
+++ b/vector/components/externalLinks.less
@@ -0,0 +1,10 @@
+@import "mediawiki.mixins.less";
+// External links
+#content {
+ .external {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+ padding-right: 13px;
+ }
+}
diff --git a/vector/components/footer.less b/vector/components/footer.less
new file mode 100644
index 0000000..3d61b66
--- /dev/null
+++ b/vector/components/footer.less
@@ -0,0 +1,57 @@
+/* Footer */
+div#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ direction: ltr;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+
+ li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333;
+ font-size: 0.7em;
+ }
+ }
+
+ #footer-icons {
+ float: right;
+
+ li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+ text-align: right;
+ }
+ }
+
+ #footer-info {
+ li {
+ line-height: 1.4em;
+ }
+ }
+
+ #footer-places {
+ li {
+ float: left;
+ margin-right: 1em;
+ line-height: 2em;
+ }
+ }
+}
+
+body.ltr {
+ div#footer {
+ #footer-places {
+ /* @noflip */
+ float: left;
+ }
+ }
+}
diff --git a/vector/components/navigation.less b/vector/components/navigation.less
new file mode 100644
index 0000000..f3a5a49
--- /dev/null
+++ b/vector/components/navigation.less
@@ -0,0 +1,134 @@
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "collapsibleNav";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
+ background-image: url('images/page-fade.png');
+ .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
+ background-color: @body-background-color;
+}
+
+#mw-head-base {
+ margin-top: -5em;
+ margin-left: 10em;
+ height: 5em;
+}
+
+div#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+
+ h3 {
+ margin: 0;
+ padding: 0;
+ }
+}
+
+/* Navigation Containers */
+#left-navigation {
+ float: left;
+ margin-left: 10em;
+ margin-top: 2.5em;
+ /* When right nav would overlap left nav, it's placed below it
+ (normal CSS floats behavior). This rule ensures that no empty space
+ is shown between them due to right nav's margin-top. Page layout
+ is still broken, but at least the nav overlaps only the page title
+ instead of half the content. */
+ margin-bottom: -2.5em;
+ /* IE 6 double-margin bug fix */
+ display: inline;
+}
+
+#right-navigation {
+ float: right;
+ margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ left: 0;
+ width: 10em;
+ height: 160px;
+
+ a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+ }
+}
+
+/* Panel */
+div#mw-panel {
+ font-size: @menu-main-font-size;
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+
+ div.portal {
+ padding-bottom: 1.5em;
+ direction: ltr;
+
+ h3 {
+ font-weight: normal;
+ color: #444;
+ padding: @menu-main-heading-padding;
+ cursor: default;
+ border: none;
+ font-size: @menu-main-heading-font-size;
+ }
+
+ div.body {
+ padding-top: 0.5em;
+ margin: @menu-main-body-margin;
+
+ .background-image('images/portal-break.png');
+ background-repeat: no-repeat;
+ background-position: top left;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ padding: @menu-main-body-padding;
+ margin: 0;
+
+ li {
+ line-height: 1.125em;
+ padding: 0;
+ padding-bottom: 0.5em;
+ margin: 0;
+ font-size: @menu-main-body-font-size;
+ word-wrap: break-word;
+
+ a {
+ color: @menu-main-body-link-color;
+ &:visited {
+ color: @menu-main-body-link-visited-color;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/vector/components/notifications.less b/vector/components/notifications.less
new file mode 100644
index 0000000..cadb61c
--- /dev/null
+++ b/vector/components/notifications.less
@@ -0,0 +1,20 @@
+/* mediawiki.notification */
+.skin-vector {
+ .mw-notification-area {
+ font-size: 0.8em;
+ }
+
+ .mw-notification-area-layout {
+ top: 7em;
+ }
+
+ .mw-notification {
+ background-color: #fff;
+ background-color: rgba(255, 255, 255, 0.93);
+ padding: 0.75em 1.5em;
+ border: solid 1px @content-border-color;
+ border-radius: 0.75em;
+ -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+ box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+ }
+}
diff --git a/vector/components/personalMenu.less b/vector/components/personalMenu.less
new file mode 100644
index 0000000..7256929
--- /dev/null
+++ b/vector/components/personalMenu.less
@@ -0,0 +1,41 @@
+/* Personal */
+#p-personal {
+ position: absolute;
+ top: 0.33em;
+ right: 0.75em;
+ /* Display on top of page tabs - bugs 37158, 48078 */
+ z-index: 100;
+
+ h3 {
+ display: none;
+ }
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding-left: 10em; /* Keep from overlapping logo */
+ }
+
+ li {
+ line-height: 1.125em;
+ /* @noflip */
+ float: left;
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: @menu-personal-font-size;
+ white-space: nowrap;
+ }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background-position: left top;
+ background-repeat: no-repeat;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+ padding-left: 15px !important;
+}
diff --git a/vector/components/search.less b/vector/components/search.less
new file mode 100644
index 0000000..46c3030
--- /dev/null
+++ b/vector/components/search.less
@@ -0,0 +1,113 @@
+/* Search */
+#p-search {
+ /* @noflip */
+ float: left;
+ margin-right: 0.5em;
+ margin-left: 0.5em;
+
+ h3 {
+ display: none;
+ }
+
+ form,
+ input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+}
+
+div#simpleSearch {
+ display: block;
+ width: 14em;
+ height: 1.4em;
+ margin-top: 0.65em;
+ position: relative;
+ min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+ border: solid 1px #aaa;
+ color: black;
+ background-color: white;
+ .background-image('images/search-fade.png');
+ background-position: top left;
+ background-repeat: repeat-x;
+
+ // Styles for both the search input and the button
+ input {
+ position: absolute;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ background-color: transparent;
+ color: black;
+ }
+
+ // The search input
+ #searchInput {
+ top: 0;
+ left: 0;
+ width: 90%;
+ padding: 0.2em 0 0.2em 0.2em;
+ font-size: 13px;
+ direction: ltr;
+
+ &:focus {
+ outline: none;
+ }
+
+ // These rules MAY NOT be merged because of how CSS requires browsers
+ // to parse unrecognized selectors!
+ // Note these rules ensure that placeholder text can be distinguished from
+ // standard text. In browsers which make this distinction clear these rules
+ // are not necessary.
+ // For inputs that use jquery.placeholder.js e.g. IE9-
+ &.placeholder {
+ color: #999;
+ }
+ // Distinguish placeholder text in IE10+
+ &:-ms-input-placeholder {
+ color: #999;
+ }
+ // Distinguish placeholder text in Firefox 18-
+ &:-moz-placeholder {
+ color: #999;
+ }
+
+ // Undo the styles Webkit browsers apply to type=search fields,
+ // we provide our own
+ -webkit-appearance: textfield;
+
+ &::-webkit-search-decoration,
+ &::-webkit-search-cancel-button,
+ &::-webkit-search-results-button,
+ &::-webkit-search-results-decoration {
+ -webkit-appearance: textfield;
+ }
+ }
+
+ // The buttons. They are displayed in the same position, and if both are
+ // present the fulltext search one obscures the 'Go' one.
+ #searchButton,
+ #mw-searchButton {
+ top: 0;
+ right: 0;
+ width: 10%;
+ height: 100%;
+ cursor: pointer;
+ /* Hide button text and replace it with the image. */
+ /* This would be 100% if not for Firefox shenanigans (bug 60900). */
+ text-indent: 200%;
+ /* Needed to make IE6 respect the text-indent. */
+ line-height: 1;
+ /* Opera 12 on RTL flips the text in a funny way without this. */
+ /* @noflip */
+ direction: ltr;
+ white-space: nowrap;
+ overflow: hidden;
+ .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+
+ #mw-searchButton {
+ z-index: 1;
+ }
+}
diff --git a/vector/components/tabs.less b/vector/components/tabs.less
new file mode 100644
index 0000000..7e24ae7
--- /dev/null
+++ b/vector/components/tabs.less
@@ -0,0 +1,274 @@
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3,
+div.vectorMenu h3 span {
+ display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+ /* @noflip */
+ float: left;
+ height: 2.5em;
+ .background-image('images/tab-break.png');
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding-left: 1px;
+
+ ul {
+ /* @noflip */
+ float: left;
+ height: 100%;
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+ .background-image('images/tab-break.png');
+ background-position: right bottom;
+ background-repeat: no-repeat;
+
+ li {
+ /* @noflip */
+ float: left;
+ line-height: 1.125em;
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #f3f3f3;
+ .background-image('images/tab-normal-fade.png');
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ white-space: nowrap;
+ }
+
+ /* IGNORED BY IE6 which doesn't support child selector */
+ > li {
+ display: block;
+ }
+ }
+
+ li {
+ &.new {
+ a,
+ a:visited{
+ color: #a55858;
+ }
+ }
+
+ &.selected {
+ .background-image('images/tab-current-fade.png');
+ a,
+ a:visited{
+ color: #333;
+ text-decoration: none;
+ }
+ }
+
+ &.icon {
+ a {
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ }
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 1.9em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ display: block;
+ }
+ }
+
+ span {
+ display: inline-block;
+ .background-image('images/tab-break.png');
+ background-position: bottom right;
+ background-repeat: no-repeat;
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ /* @noflip */
+ float: left;
+ display: block;
+ }
+ }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+ /* @noflip */
+ direction: ltr;
+ /* @noflip */
+ float: left;
+ .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+ /* @noflip */
+ background-position: 100% 60%;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ .transition(background-position 250ms);
+}
+
+div.vectorMenu.menuForceShow {
+ background-position: 100% 100%;
+}
+
+div.vectorMenuFocus {
+ .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+ background-position: 100% 60%;
+}
+
+body.rtl div.vectorMenu {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#mw-head div.vectorMenu h3 {
+ /* @noflip */
+ float: left;
+ .background-image('images/tab-break.png');
+ background-repeat: no-repeat;
+ background-position: bottom left;
+ margin-left: -1px;
+}
+
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3 {
+ background-image: none;
+}
+
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
+ display: inline-block;
+ float: left;
+ font-size: 0.8em;
+ padding-left: 0.5em;
+ padding-top: 1.375em;
+ font-weight: normal;
+ border: none;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu h3 a {
+ display: inline-block;
+ width: 24px;
+ height: 1.9em;
+ text-decoration: none;
+ .background-image('images/tab-break.png');
+ background-repeat: no-repeat;
+ background-position: bottom right;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu h3 > a {
+ display: block;
+}
+
+div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: left;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+body.rtl div.vectorMenu div.menu {
+ /* @noflip */
+ margin-left: 24px;
+}
+
+/* IGNORED BY IE6 */
+body.rtl div.vectorMenu > div.menu {
+ /* @noflip */
+ margin-left: auto;
+}
+
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+ /* @noflip */
+ margin-left: 23px;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu.menuForceShow div.menu {
+ display: block;
+}
+
+div.vectorMenu ul {
+ position: absolute;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style-type: none;
+ list-style-image: none;
+ padding: 0;
+ margin: 0;
+ margin-left: -1px;
+ text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+ min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+ min-width: 0;
+}
+
+div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+ display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+ color: #333;
+ text-decoration: none;
+}
+
+@import 'watchstar.less';
diff --git a/vector/components/watchstar.less b/vector/components/watchstar.less
new file mode 100644
index 0000000..1a6d1fc
--- /dev/null
+++ b/vector/components/watchstar.less
@@ -0,0 +1,46 @@
+@import "mediawiki.mixins.rotation"
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ display: block;
+ width: 26px;
+ /* This hides the text but shows the background image */
+ padding-top: 3.1em;
+ margin-top: 0;
+ /* Only applied in IE6 */
+ margin-top: -0.8em !ie;
+ height: 0;
+ overflow: hidden;
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a {
+ .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
+}
+#ca-watch.icon a {
+ .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+ .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+ .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
+ .rotation(700ms);
+ /* Suppress the hilarious rotating focus outline on Firefox */
+ outline: none;
+ background-position: 50% 60%;
+ -webkit-transform-origin: 50% 57%;
+ transform-origin: 50% 57%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
diff --git a/vector/csshover.htc b/vector/csshover.htc
new file mode 100644
index 0000000..a13ea68
--- /dev/null
+++ b/vector/csshover.htc
@@ -0,0 +1,284 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * ------------------------------------------------------------
+ * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
+ * License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
+ * for fixing the expression loop.
+ *
+ * Whatever:hover 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.
+ *
+ * Whatever:hover 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.
+ *
+ * howto: body { behavior:url("csshover3.htc"); }
+ * ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+ // regular expressions, used and explained later on.
+ var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
+ var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
+ var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
+ var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
+ var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
+ var REG_MSIE = /msie (5|6|7)/i;
+ var REG_COMPAT = /backcompat/i;
+
+ // property mapping, real css properties must be used in order to clear expressions later on...
+ // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
+ // set an expression, and are then restored to the most likely correct value.
+ var Properties = {
+ index: 0,
+ list: ['text-kashida', 'text-kashida-space', 'text-justify'],
+ get: function() {
+ return this.list[(this.index++)%this.list.length];
+ }
+ };
+
+ // camelize is used to convert css properties from (eg) text-kashida to textKashida
+ var camelize = function(str) {
+ return str.replace(/-(.)/mg, function(result, match){
+ return match.toUpperCase();
+ });
+ };
+
+ /**
+ * Local CSSHover object
+ * --------------------------
+ */
+
+ var CSSHover = {
+
+ // array of CSSHoverElements, used to unload created events
+ elements: [],
+
+ // buffer used for checking on duplicate expressions
+ callbacks: {},
+
+ // init, called once ondomcontentready via the exposed window.CSSHover function
+ init:function() {
+ // don't run in IE8 standards; expressions don't work in standards mode anyway,
+ // and the stuff we're trying to fix should already work properly
+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
+ return;
+ }
+
+ // start parsing the existing stylesheets
+ var sheets = window.document.styleSheets, l = sheets.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheets[i]);
+ }
+ },
+
+ // called from init, parses individual stylesheets
+ parseStylesheet:function(sheet) {
+ // check sheet imports and parse those recursively
+ if(sheet.imports) {
+ try {
+ var imports = sheet.imports;
+ var l = imports.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheet.imports[i]);
+ }
+ } catch(securityException){
+ // trycatch for various possible errors
+ }
+ }
+
+ // interate the sheet's rules and send them to the parser
+ try {
+ var rules = sheet.rules;
+ var r = rules.length;
+ for(var j=0; j<r; j++) {
+ this.parseCSSRule(rules[j], sheet);
+ }
+ } catch(someException){
+ // trycatch for various errors, most likely accessing the sheet's rules.
+ }
+ },
+
+ // magic starts here ...
+ parseCSSRule:function(rule, sheet) {
+
+ // The sheet is used to insert new rules into, this must be the same sheet the rule
+ // came from, to ensure that relative paths keep pointing to the right location.
+
+ // only parse a rule if it contains an interactive pseudo.
+ var select = rule.selectorText;
+ if(REG_INTERACTIVE.test(select)) {
+ var style = rule.style.cssText;
+
+ // affected elements are found by truncating the selector after the interactive pseudo,
+ // eg: "div li:hover" >> "div li"
+ var affected = REG_AFFECTED.exec(select)[1];
+
+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+ // eg: "li:hover" >> "onhover"
+ var pseudo = select.replace(REG_PSEUDO, 'on$1');
+
+ // the new selector is going to use that classname in a new css rule,
+ // since IE6 doesn't support multiple classnames, this is merged into one classname
+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
+ var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
+
+ // the classname is needed for the events that are going to be set on affected nodes
+ // eg: "li.folder:hover" >> "folderonhover"
+ var className = REG_CLASS.exec(newSelect)[1];
+
+ // no need to set the same callback more than once when the same selector uses the same classname
+ var hash = affected + className;
+ if(!this.callbacks[hash]) {
+
+ // affected elements are given an expression under a borrowed css property, because fake properties
+ // can't have their expressions cleared. Different properties are used per pseudo, to avoid
+ // expressions from overwriting eachother. The expression does a callback to CSSHover.patch,
+ // rerouted via the exposed window.CSSHover function.
+ var property = Properties.get();
+ var atRuntime = camelize(property);
+
+ // because the expression is added to the stylesheet, and styles are always applied to html that is
+ // dynamically added to the dom, the expression will also trigger for those new elements (provided
+ // they are selected by the affected selector).
+ sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
+
+ // hash it, so an identical selector/class combo does not duplicate the expression
+ this.callbacks[hash] = true;
+ }
+
+ // duplicate expressions need not be set, but the style could differ
+ sheet.addRule(newSelect, style);
+ }
+ },
+
+ // called via the expression, patches individual nodes
+ patch:function(node, type, className, property) {
+
+ // restores the borrowed css property to the value of its immediate parent, clearing
+ // the expression so that it's not repeatedly called.
+ try {
+ var value = node.parentNode.currentStyle[property];
+ node.style[property] = value;
+ } catch(e) {
+ // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
+ // this will also stop the expression.
+ node.runtimeStyle[property] = '';
+ }
+
+ // just to make sure, also keep track of patched classnames locally on the node
+ if(!node.csshover) {
+ node.csshover = [];
+ }
+
+ // and check for it to prevent duplicate events with the same classname from being set
+ if(!node.csshover[className]) {
+ node.csshover[className] = true;
+
+ // create an instance for the given type and class
+ var element = new CSSHoverElement(node, type, className);
+
+ // and store that instance for unloading later on
+ this.elements.push(element);
+ }
+
+ // returns a dummy value to the expression
+ return type;
+ },
+
+ // unload stuff onbeforeunload
+ unload:function() {
+ try {
+
+ // remove events
+ var l = this.elements.length;
+ for(var i=0; i<l; i++) {
+ this.elements[i].unload();
+ }
+
+ // and set properties to null
+ this.elements = [];
+ this.callbacks = {};
+
+ } catch (e) {
+ }
+ }
+ };
+
+ /**
+ * CSSHoverElement
+ * --------------------------
+ */
+
+ // the event types associated with the interactive pseudos
+ var CSSEvents = {
+ onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+ onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
+ onfocus: { activator: 'onfocus', deactivator: 'onblur' }
+ };
+
+ // CSSHoverElement constructor, called via CSSHover.patch
+ function CSSHoverElement(node, type, className) {
+
+ // the CSSHoverElement patches individual nodes by manually applying the events that should
+ // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
+
+ this.node = node;
+ this.type = type;
+ var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+ // store event handlers for removal onunload
+ this.activator = function(){ node.className += ' ' + className; };
+ this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+
+ // add the events
+ node.attachEvent(CSSEvents[type].activator, this.activator);
+ node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+ }
+
+ CSSHoverElement.prototype = {
+ // onbeforeunload, called via CSSHover.unload
+ unload:function() {
+
+ // remove events
+ this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+ this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+ // and set properties to null
+ this.activator = null;
+ this.deactivator = null;
+ this.node = null;
+ this.type = null;
+ }
+ };
+
+ // add the unload to the onbeforeunload event
+ window.attachEvent('onbeforeunload', function(){
+ CSSHover.unload();
+ });
+
+ /**
+ * Public hook
+ * --------------------------
+ */
+
+ return function(node, type, className, property) {
+ if(node) {
+ // called via the css expression; patches individual nodes
+ return CSSHover.patch(node, type, className, property);
+ } else {
+ // called ondomcontentready via the public:attach node
+ CSSHover.init();
+ }
+ };
+
+})();
+</script> \ No newline at end of file
diff --git a/vector/csshover.min.htc b/vector/csshover.min.htc
new file mode 100644
index 0000000..7e5c57b
--- /dev/null
+++ b/vector/csshover.min.htc
@@ -0,0 +1,12 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * http://www.xs4all.nl/~peterned/
+ *
+ * Copyright (c) 2009 Peter Nederlof
+ * Licensed under the LGPL license
+ * http://creativecommons.org/licenses/LGPL/2.1
+ */
+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
+</script>
diff --git a/vector/images/arrow-collapsed-ltr.png b/vector/images/arrow-collapsed-ltr.png
new file mode 100644
index 0000000..063ac6f
--- /dev/null
+++ b/vector/images/arrow-collapsed-ltr.png
Binary files differ
diff --git a/vector/images/arrow-collapsed-ltr.svg b/vector/images/arrow-collapsed-ltr.svg
new file mode 100644
index 0000000..b943caa
--- /dev/null
+++ b/vector/images/arrow-collapsed-ltr.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg> \ No newline at end of file
diff --git a/vector/images/arrow-collapsed-rtl.png b/vector/images/arrow-collapsed-rtl.png
new file mode 100644
index 0000000..c346218
--- /dev/null
+++ b/vector/images/arrow-collapsed-rtl.png
Binary files differ
diff --git a/vector/images/arrow-collapsed-rtl.svg b/vector/images/arrow-collapsed-rtl.svg
new file mode 100644
index 0000000..5faf356
--- /dev/null
+++ b/vector/images/arrow-collapsed-rtl.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg> \ No newline at end of file
diff --git a/vector/images/arrow-down-focus-icon.png b/vector/images/arrow-down-focus-icon.png
new file mode 100644
index 0000000..7640bd1
--- /dev/null
+++ b/vector/images/arrow-down-focus-icon.png
Binary files differ
diff --git a/vector/images/arrow-down-focus-icon.svg b/vector/images/arrow-down-focus-icon.svg
new file mode 100644
index 0000000..826c280
--- /dev/null
+++ b/vector/images/arrow-down-focus-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg> \ No newline at end of file
diff --git a/vector/images/arrow-down-icon.png b/vector/images/arrow-down-icon.png
new file mode 100644
index 0000000..12e3b93
--- /dev/null
+++ b/vector/images/arrow-down-icon.png
Binary files differ
diff --git a/vector/images/arrow-down-icon.svg b/vector/images/arrow-down-icon.svg
new file mode 100644
index 0000000..8e31b2f
--- /dev/null
+++ b/vector/images/arrow-down-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg> \ No newline at end of file
diff --git a/vector/images/arrow-expanded.png b/vector/images/arrow-expanded.png
new file mode 100644
index 0000000..0221028
--- /dev/null
+++ b/vector/images/arrow-expanded.png
Binary files differ
diff --git a/vector/images/arrow-expanded.svg b/vector/images/arrow-expanded.svg
new file mode 100644
index 0000000..e744ec3
--- /dev/null
+++ b/vector/images/arrow-expanded.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg> \ No newline at end of file
diff --git a/vector/images/bullet-icon.png b/vector/images/bullet-icon.png
new file mode 100644
index 0000000..7bae98f
--- /dev/null
+++ b/vector/images/bullet-icon.png
Binary files differ
diff --git a/vector/images/external-link-ltr-icon.png b/vector/images/external-link-ltr-icon.png
new file mode 100644
index 0000000..6308383
--- /dev/null
+++ b/vector/images/external-link-ltr-icon.png
Binary files differ
diff --git a/vector/images/external-link-ltr-icon.svg b/vector/images/external-link-ltr-icon.svg
new file mode 100644
index 0000000..5969d03
--- /dev/null
+++ b/vector/images/external-link-ltr-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg> \ No newline at end of file
diff --git a/vector/images/external-link-rtl-icon.png b/vector/images/external-link-rtl-icon.png
new file mode 100644
index 0000000..5313234
--- /dev/null
+++ b/vector/images/external-link-rtl-icon.png
Binary files differ
diff --git a/vector/images/external-link-rtl-icon.svg b/vector/images/external-link-rtl-icon.svg
new file mode 100644
index 0000000..75a7025
--- /dev/null
+++ b/vector/images/external-link-rtl-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg> \ No newline at end of file
diff --git a/vector/images/link-icon.png b/vector/images/link-icon.png
new file mode 100644
index 0000000..b70efaa
--- /dev/null
+++ b/vector/images/link-icon.png
Binary files differ
diff --git a/vector/images/magnify-clip.png b/vector/images/magnify-clip.png
new file mode 100644
index 0000000..00a9cee
--- /dev/null
+++ b/vector/images/magnify-clip.png
Binary files differ
diff --git a/vector/images/page-fade.png b/vector/images/page-fade.png
new file mode 100644
index 0000000..b4a6034
--- /dev/null
+++ b/vector/images/page-fade.png
Binary files differ
diff --git a/vector/images/portal-break-ltr.png b/vector/images/portal-break-ltr.png
new file mode 100644
index 0000000..20bf366
--- /dev/null
+++ b/vector/images/portal-break-ltr.png
Binary files differ
diff --git a/vector/images/portal-break-rtl.png b/vector/images/portal-break-rtl.png
new file mode 100644
index 0000000..e5f6223
--- /dev/null
+++ b/vector/images/portal-break-rtl.png
Binary files differ
diff --git a/vector/images/portal-break.png b/vector/images/portal-break.png
new file mode 100644
index 0000000..90c3918
--- /dev/null
+++ b/vector/images/portal-break.png
Binary files differ
diff --git a/vector/images/preferences/break.png b/vector/images/preferences/break.png
new file mode 100644
index 0000000..b529308
--- /dev/null
+++ b/vector/images/preferences/break.png
Binary files differ
diff --git a/vector/images/preferences/fade.png b/vector/images/preferences/fade.png
new file mode 100644
index 0000000..638084d
--- /dev/null
+++ b/vector/images/preferences/fade.png
Binary files differ
diff --git a/vector/images/search-fade.png b/vector/images/search-fade.png
new file mode 100644
index 0000000..6cb7d28
--- /dev/null
+++ b/vector/images/search-fade.png
Binary files differ
diff --git a/vector/images/search-ltr.png b/vector/images/search-ltr.png
new file mode 100644
index 0000000..1db2eb2
--- /dev/null
+++ b/vector/images/search-ltr.png
Binary files differ
diff --git a/vector/images/search-ltr.svg b/vector/images/search-ltr.svg
new file mode 100644
index 0000000..0720f20
--- /dev/null
+++ b/vector/images/search-ltr.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg> \ No newline at end of file
diff --git a/vector/images/search-rtl.png b/vector/images/search-rtl.png
new file mode 100644
index 0000000..c26c8d0
--- /dev/null
+++ b/vector/images/search-rtl.png
Binary files differ
diff --git a/vector/images/search-rtl.svg b/vector/images/search-rtl.svg
new file mode 100644
index 0000000..622d5f9
--- /dev/null
+++ b/vector/images/search-rtl.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg> \ No newline at end of file
diff --git a/vector/images/tab-break.png b/vector/images/tab-break.png
new file mode 100644
index 0000000..6d37af5
--- /dev/null
+++ b/vector/images/tab-break.png
Binary files differ
diff --git a/vector/images/tab-current-fade.png b/vector/images/tab-current-fade.png
new file mode 100644
index 0000000..b8f772f
--- /dev/null
+++ b/vector/images/tab-current-fade.png
Binary files differ
diff --git a/vector/images/tab-normal-fade.png b/vector/images/tab-normal-fade.png
new file mode 100644
index 0000000..f719a88
--- /dev/null
+++ b/vector/images/tab-normal-fade.png
Binary files differ
diff --git a/vector/images/unwatch-icon-hl.png b/vector/images/unwatch-icon-hl.png
new file mode 100644
index 0000000..6b2b502
--- /dev/null
+++ b/vector/images/unwatch-icon-hl.png
Binary files differ
diff --git a/vector/images/unwatch-icon-hl.svg b/vector/images/unwatch-icon-hl.svg
new file mode 100644
index 0000000..d52d547
--- /dev/null
+++ b/vector/images/unwatch-icon-hl.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg> \ No newline at end of file
diff --git a/vector/images/unwatch-icon.png b/vector/images/unwatch-icon.png
new file mode 100644
index 0000000..9fd9436
--- /dev/null
+++ b/vector/images/unwatch-icon.png
Binary files differ
diff --git a/vector/images/unwatch-icon.svg b/vector/images/unwatch-icon.svg
new file mode 100644
index 0000000..cde7bc5
--- /dev/null
+++ b/vector/images/unwatch-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg> \ No newline at end of file
diff --git a/vector/images/user-icon.png b/vector/images/user-icon.png
new file mode 100644
index 0000000..57f9f8d
--- /dev/null
+++ b/vector/images/user-icon.png
Binary files differ
diff --git a/vector/images/user-icon.svg b/vector/images/user-icon.svg
new file mode 100644
index 0000000..4335bcf
--- /dev/null
+++ b/vector/images/user-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg> \ No newline at end of file
diff --git a/vector/images/watch-icon-hl.png b/vector/images/watch-icon-hl.png
new file mode 100644
index 0000000..4cb87cd
--- /dev/null
+++ b/vector/images/watch-icon-hl.png
Binary files differ
diff --git a/vector/images/watch-icon-hl.svg b/vector/images/watch-icon-hl.svg
new file mode 100644
index 0000000..664c671
--- /dev/null
+++ b/vector/images/watch-icon-hl.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg> \ No newline at end of file
diff --git a/vector/images/watch-icon-loading.png b/vector/images/watch-icon-loading.png
new file mode 100644
index 0000000..5f0c490
--- /dev/null
+++ b/vector/images/watch-icon-loading.png
Binary files differ
diff --git a/vector/images/watch-icon-loading.svg b/vector/images/watch-icon-loading.svg
new file mode 100644
index 0000000..751eb14
--- /dev/null
+++ b/vector/images/watch-icon-loading.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg> \ No newline at end of file
diff --git a/vector/images/watch-icon.png b/vector/images/watch-icon.png
new file mode 100644
index 0000000..39daff2
--- /dev/null
+++ b/vector/images/watch-icon.png
Binary files differ
diff --git a/vector/images/watch-icon.svg b/vector/images/watch-icon.svg
new file mode 100644
index 0000000..907b05b
--- /dev/null
+++ b/vector/images/watch-icon.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg> \ No newline at end of file
diff --git a/vector/screen-hd.less b/vector/screen-hd.less
new file mode 100644
index 0000000..8b286f4
--- /dev/null
+++ b/vector/screen-hd.less
@@ -0,0 +1,30 @@
+/* Vector screen styles for high definition displays */
+
+@import "variables.less";
+
+div#content {
+ margin-left: 11em;
+ padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+ left: @menu-main-logo-left;
+}
+div#footer {
+ margin-left: 11em;
+ padding: 1.25em;
+}
+#mw-panel {
+ padding-left: 0.5em;
+}
+#p-search {
+ margin-right: 1em;
+}
+#left-navigation {
+ margin-left: 11em;
+}
+#p-personal {
+ right: 1em;
+}
+#mw-head-base {
+ margin-left: 11em;
+}
diff --git a/vector/screen.less b/vector/screen.less
new file mode 100644
index 0000000..f7b374f
--- /dev/null
+++ b/vector/screen.less
@@ -0,0 +1,10 @@
+/* Vector screen styles */
+
+@import "variables.less";
+
+@import "components/common.less";
+@import "components/animations.less";
+@import "components/navigation.less";
+@import "components/footer.less";
+@import 'components/notifications.less';
+@import "components/externalLinks.less";
diff --git a/vector/special.less b/vector/special.less
new file mode 100644
index 0000000..6af4b1e
--- /dev/null
+++ b/vector/special.less
@@ -0,0 +1,7 @@
+/**
+ * Adjusts for decreased margin-bottom for h2 elements inside #content div
+ * introduced in March / April 2014 typography update.
+ */
+table.mw-specialpages-table {
+ margin-top: 0;
+}
diff --git a/vector/special.preferences.less b/vector/special.preferences.less
new file mode 100644
index 0000000..a9b1006
--- /dev/null
+++ b/vector/special.preferences.less
@@ -0,0 +1,114 @@
+@import "mediawiki.mixins";
+@import "variables";
+
+/**
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+#preftoc {
+ /* Tabs */
+ width: 100%;
+ float: left;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ .background-image('images/preferences/break.png');
+ background-position: bottom left;
+ background-repeat: no-repeat;
+
+ li {
+ /* Tab */
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-right: 1px;
+ height: 2.25em;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ .background-image('images/preferences/break.png');
+ background-position: bottom right;
+ background-repeat: no-repeat;
+
+ /* Sadly, IE6 won't understand this */
+ &:first-child {
+ margin-left: 1px;
+ }
+
+ &.selected {
+ a {
+ .background-image('images/preferences/fade.png');
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333;
+ text-decoration: none;
+ }
+ }
+ }
+
+ a,
+ a:active {
+ display: inline-block;
+ position: relative;
+ color: @menu-link-color;
+ padding: 0.5em;
+ text-decoration: none;
+ background-image: none;
+ font-size: 0.9em;
+ }
+
+ a:hover,
+ a:focus {
+ text-decoration: underline;
+ }
+}
+
+#preferences {
+ float: left;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #ccc;
+ background-color: #fafafa;
+
+ fieldset {
+ border: none;
+ border-top: solid 1px #ccc;
+
+ &.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+
+ legend.mainLegend {
+ display: none;
+ }
+ }
+ }
+
+ legend {
+ color: #666;
+ }
+
+ td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ }
+
+ div.mw-prefs-buttons {
+ padding: 1em;
+
+ input {
+ margin-right: 0.25em;
+ }
+ }
+}
+
+.htmlform-tip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
diff --git a/vector/variables.less b/vector/variables.less
new file mode 100644
index 0000000..f008a3a
--- /dev/null
+++ b/vector/variables.less
@@ -0,0 +1,43 @@
+@html-font-size: 1em;
+
+// Page content
+// FIXME: Use global variable since Echo and CentralNotice use this variable
+@content-border-color: #a7d7f9;
+// FIXME: Find an open font that works with this stack and is readable by Windows users
+@content-font-family: sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.875em;
+@content-line-height: 1.6;
+@content-padding: 1em;
+@content-heading-font-size: 1.8em;
+@content-heading-font-family: sans-serif;
+@body-background-color: #fff;
+@heading-line-height: 1.3;
+
+// Navigation
+@menu-background-color: #f6f6f6;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0 1.75em 0.25em 0.25em;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #4d4d4d;
+@collapsible-nav-heading-collapsed-color: #0645ad;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
diff --git a/vector/vector.js b/vector/vector.js
new file mode 100644
index 0000000..0bc114a
--- /dev/null
+++ b/vector/vector.js
@@ -0,0 +1,55 @@
+/**
+ * Vector-specific scripts
+ */
+jQuery( function ( $ ) {
+ $( 'div.vectorMenu' ).each( function () {
+ var $el = $( this );
+ $el.find( '> h3 > a' ).parent()
+ .attr( 'tabindex', '0' )
+ // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+ .on( 'click keypress', function ( e ) {
+ if ( e.type === 'click' || e.which === 13 ) {
+ $el.toggleClass( 'menuForceShow' );
+ e.preventDefault();
+ }
+ } )
+ // When the heading has focus, also set a class that will change the arrow icon
+ .focus( function () {
+ $el.find( '> a' ).addClass( 'vectorMenuFocus' );
+ } )
+ .blur( function () {
+ $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+ } )
+ .find( '> a:first' )
+ // As the h3 can already be focused there's no need for the link to be focusable
+ .attr( 'tabindex', '-1' );
+ } );
+
+ /**
+ * Collapsible tabs for Vector
+ */
+ var $cactions = $( '#p-cactions' );
+
+ // Bind callback functions to animate our drop down menu in and out
+ // and then call the collapsibleTabs function on the menu
+ $( '#p-views ul' )
+ .bind( 'beforeTabCollapse', function () {
+ // If the dropdown was hidden, show it
+ if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+ $cactions
+ .removeClass( 'emptyPortlet' )
+ .find( 'h3' )
+ .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
+ }
+ } )
+ .bind( 'beforeTabExpand', function () {
+ // If we're removing the last child node right now, hide the dropdown
+ if ( $cactions.find( 'li' ).length === 1 ) {
+ $cactions.find( 'h3' ).animate( { 'width': '1px' }, 390, function () {
+ $( this ).attr( 'style', '' )
+ .parent().addClass( 'emptyPortlet' );
+ });
+ }
+ } )
+ .collapsibleTabs();
+} );