Introducing mediaWiki.language, and mediaWiki.message which are modeled after their...
authorTrevor Parscal <tparscal@users.mediawiki.org>
Tue, 26 Oct 2010 23:40:26 +0000 (23:40 +0000)
committerTrevor Parscal <tparscal@users.mediawiki.org>
Tue, 26 Oct 2010 23:40:26 +0000 (23:40 +0000)
60 files changed:
resources/Resources.php
resources/mediawiki.language/languages/am.js [new file with mode: 0644]
resources/mediawiki.language/languages/ar.js [new file with mode: 0644]
resources/mediawiki.language/languages/bat-smg.js [new file with mode: 0644]
resources/mediawiki.language/languages/be-tarask.js [new file with mode: 0644]
resources/mediawiki.language/languages/be.js [new file with mode: 0644]
resources/mediawiki.language/languages/bh.js [new file with mode: 0644]
resources/mediawiki.language/languages/bs.js [new file with mode: 0644]
resources/mediawiki.language/languages/cs.js [new file with mode: 0644]
resources/mediawiki.language/languages/cu.js [new file with mode: 0644]
resources/mediawiki.language/languages/cy.js [new file with mode: 0644]
resources/mediawiki.language/languages/dsb.js [new file with mode: 0644]
resources/mediawiki.language/languages/fr.js [new file with mode: 0644]
resources/mediawiki.language/languages/ga.js [new file with mode: 0644]
resources/mediawiki.language/languages/gd.js [new file with mode: 0644]
resources/mediawiki.language/languages/gv.js [new file with mode: 0644]
resources/mediawiki.language/languages/he.js [new file with mode: 0644]
resources/mediawiki.language/languages/hi.js [new file with mode: 0644]
resources/mediawiki.language/languages/hr.js [new file with mode: 0644]
resources/mediawiki.language/languages/hsb.js [new file with mode: 0644]
resources/mediawiki.language/languages/hy.js [new file with mode: 0644]
resources/mediawiki.language/languages/ksh.js [new file with mode: 0644]
resources/mediawiki.language/languages/ln.js [new file with mode: 0644]
resources/mediawiki.language/languages/lt.js [new file with mode: 0644]
resources/mediawiki.language/languages/lv.js [new file with mode: 0644]
resources/mediawiki.language/languages/mg.js [new file with mode: 0644]
resources/mediawiki.language/languages/mk.js [new file with mode: 0644]
resources/mediawiki.language/languages/mo.js [new file with mode: 0644]
resources/mediawiki.language/languages/mt.js [new file with mode: 0644]
resources/mediawiki.language/languages/nso.js [new file with mode: 0644]
resources/mediawiki.language/languages/pl.js [new file with mode: 0644]
resources/mediawiki.language/languages/pt-br.js [new file with mode: 0644]
resources/mediawiki.language/languages/ro.js [new file with mode: 0644]
resources/mediawiki.language/languages/ru.js [new file with mode: 0644]
resources/mediawiki.language/languages/se.js [new file with mode: 0644]
resources/mediawiki.language/languages/sh.js [new file with mode: 0644]
resources/mediawiki.language/languages/sk.js [new file with mode: 0644]
resources/mediawiki.language/languages/sl.js [new file with mode: 0644]
resources/mediawiki.language/languages/sma.js [new file with mode: 0644]
resources/mediawiki.language/languages/sr-ec.js [new file with mode: 0644]
resources/mediawiki.language/languages/sr-el.js [new file with mode: 0644]
resources/mediawiki.language/languages/sr.js [new file with mode: 0644]
resources/mediawiki.language/languages/ti.js [new file with mode: 0644]
resources/mediawiki.language/languages/tl.js [new file with mode: 0644]
resources/mediawiki.language/languages/uk.js [new file with mode: 0644]
resources/mediawiki.language/languages/wa.js [new file with mode: 0644]
resources/mediawiki.language/mediawiki.language.js [new file with mode: 0644]
resources/mediawiki.specials/mediawiki.specials.preferences.js [new file with mode: 0644]
resources/mediawiki.specials/mediawiki.specials.search.js [new file with mode: 0644]
resources/mediawiki.util/mediawiki.util.js [new file with mode: 0644]
resources/mediawiki.util/mediawiki.util.test.js [new file with mode: 0644]
resources/mediawiki.views/mediawiki.views.history.js [new file with mode: 0644]
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.specials.preferences.js [deleted file]
resources/mediawiki/mediawiki.specials.search.js [deleted file]
resources/mediawiki/mediawiki.util.js [deleted file]
resources/mediawiki/mediawiki.utiltest.js [deleted file]
resources/mediawiki/mediawiki.views.history.js [deleted file]
skins/common/ajaxwatch.js
skins/common/wikibits.js

index d53f33f..757822a 100644 (file)
@@ -317,21 +317,71 @@ return array(
                'debugRaw' => false
        ) ),
        'mediawiki.specials.preferences' => new ResourceLoaderFileModule( array(
-               'scripts' => 'resources/mediawiki/mediawiki.specials.preferences.js',
+               'scripts' => 'resources/mediawiki.specials/mediawiki.specials.preferences.js',
        ) ),
        'mediawiki.specials.search' => new ResourceLoaderFileModule( array(
-               'scripts' => 'resources/mediawiki/mediawiki.specials.search.js',
+               'scripts' => 'resources/mediawiki.specials/mediawiki.specials.search.js',
        ) ),
        'mediawiki.views.history' => new ResourceLoaderFileModule( array(
-               'scripts' => 'resources/mediawiki/mediawiki.views.history.js',
+               'scripts' => 'resources/mediawiki.views/mediawiki.views.history.js',
                'dependencies' => 'mediawiki.legacy.history',
        ) ),
+       'mediawiki.language' => new ResourceLoaderFileModule( array(
+               'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+               'languageScripts' => array(
+                       'am' => 'resources/mediawiki.language/languages/am.js',
+                       'ar' => 'resources/mediawiki.language/languages/ar.js',
+                       'bat-smg' => 'resources/mediawiki.language/languages/bat-smg.js',
+                       'be' => 'resources/mediawiki.language/languages/be.js',
+                       'be-tarask' => 'resources/mediawiki.language/languages/be-tarask.js',
+                       'bh' => 'resources/mediawiki.language/languages/bh.js',
+                       'bs' => 'resources/mediawiki.language/languages/bs.js',
+                       'cs' => 'resources/mediawiki.language/languages/cs.js',
+                       'cu' => 'resources/mediawiki.language/languages/cu.js',
+                       'cy' => 'resources/mediawiki.language/languages/cy.js',
+                       'dsb' => 'resources/mediawiki.language/languages/dsb.js',
+                       'fr' => 'resources/mediawiki.language/languages/fr.js',
+                       'ga' => 'resources/mediawiki.language/languages/ga.js',
+                       'gd' => 'resources/mediawiki.language/languages/gd.js',
+                       'gv' => 'resources/mediawiki.language/languages/gv.js',
+                       'he' => 'resources/mediawiki.language/languages/he.js',
+                       'hi' => 'resources/mediawiki.language/languages/hi.js',
+                       'hr' => 'resources/mediawiki.language/languages/hr.js',
+                       'hsb' => 'resources/mediawiki.language/languages/hsb.js',
+                       'hy' => 'resources/mediawiki.language/languages/hy.js',
+                       'ksh' => 'resources/mediawiki.language/languages/ksh.js',
+                       'ln' => 'resources/mediawiki.language/languages/ln.js',
+                       'lt' => 'resources/mediawiki.language/languages/lt.js',
+                       'lv' => 'resources/mediawiki.language/languages/lv.js',
+                       'mg' => 'resources/mediawiki.language/languages/mg.js',
+                       'mk' => 'resources/mediawiki.language/languages/mk.js',
+                       'mo' => 'resources/mediawiki.language/languages/mo.js',
+                       'mt' => 'resources/mediawiki.language/languages/mt.js',
+                       'nso' => 'resources/mediawiki.language/languages/nso.js',
+                       'pl' => 'resources/mediawiki.language/languages/pl.js',
+                       'pt-br' => 'resources/mediawiki.language/languages/pt-br.js',
+                       'ro' => 'resources/mediawiki.language/languages/ro.js',
+                       'ru' => 'resources/mediawiki.language/languages/ru.js',
+                       'se' => 'resources/mediawiki.language/languages/se.js',
+                       'sh' => 'resources/mediawiki.language/languages/sh.js',
+                       'sk' => 'resources/mediawiki.language/languages/sk.js',
+                       'sl' => 'resources/mediawiki.language/languages/sl.js',
+                       'sma' => 'resources/mediawiki.language/languages/sma.js',
+                       'sr-ec' => 'resources/mediawiki.language/languages/sr-ec.js',
+                       'sr-el' => 'resources/mediawiki.language/languages/sr-el.js',
+                       'sr' => 'resources/mediawiki.language/languages/sr.js',
+                       'ti' => 'resources/mediawiki.language/languages/ti.js',
+                       'tl' => 'resources/mediawiki.language/languages/tl.js',
+                       'uk' => 'resources/mediawiki.language/languages/uk.js',
+                       'wa' => 'resources/mediawiki.language/languages/wa.js',
+               ),
+       ) ),
        'mediawiki.util' => new ResourceLoaderFileModule( array(
-               'scripts' => 'resources/mediawiki/mediawiki.util.js',
-               'debugScripts' => 'resources/mediawiki/mediawiki.utiltest.js',
+               'scripts' => 'resources/mediawiki.util/mediawiki.util.js',
+               'debugScripts' => 'resources/mediawiki.util/mediawiki.util.test.js',
        ) ),
        
-       /* MediaWiki Legacy */
+       /* mediawiki Legacy */
        
        'mediawiki.legacy.ajax' => new ResourceLoaderFileModule( array(
                'scripts' => 'skins/common/ajax.js',
@@ -430,6 +480,7 @@ return array(
        ) ),
        'mediawiki.legacy.wikibits' => new ResourceLoaderFileModule( array(
                'scripts' => 'skins/common/wikibits.js',
+               'dependencies' => 'mediawiki.language',
                'messages' => array( 'showtoc', 'hidetoc' ),
        ) ),
        'mediawiki.legacy.wikiprintable' => new ResourceLoaderFileModule( array(
diff --git a/resources/mediawiki.language/languages/am.js b/resources/mediawiki.language/languages/am.js
new file mode 100644 (file)
index 0000000..9e1f4de
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Amharic (አማርኛ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/ar.js b/resources/mediawiki.language/languages/ar.js
new file mode 100644 (file)
index 0000000..62a7eac
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * Arabic (ÿߟÑÿπÿ±ÿ®Ÿäÿ©) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 6 );
+       if ( count == 0 ) {
+               return forms[0];
+       }
+       if ( count == 1 ) {
+               return forms[1];
+       }
+       if ( count == 2 ) {
+               return forms[2];
+       }
+       if ( count % 100 >= 3 && count % 100 <= 10 ) {
+               return forms[3];
+       }
+       if ( count % 100 >= 11 && count % 100 <= 99 ) {
+               return forms[4];
+       }
+       return forms[5];
+}
+
+mediaWiki.language.digitTransformTable = {
+    '0': 'Ÿ†', // &#x0660;
+    '1': 'Ÿ°', // &#x0661;
+    '2': 'Ÿ¢', // &#x0662;
+    '3': 'Ÿ£', // &#x0663;
+    '4': 'Ÿ§', // &#x0664;
+    '5': 'Ÿ•', // &#x0665;
+    '6': 'Ÿ¶', // &#x0666;
+    '7': 'Ÿß', // &#x0667;
+    '8': 'Ÿ®', // &#x0668;
+    '9': 'Ÿ©', // &#x0669;
+    '.': 'Ÿ´', // &#x066b; wrong table ?
+    ',': 'Ÿ¨' // &#x066c;
+};
diff --git a/resources/mediawiki.language/languages/bat-smg.js b/resources/mediawiki.language/languages/bat-smg.js
new file mode 100644 (file)
index 0000000..ad80786
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Samogitian (≈Ωemaitƒó≈°ka) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       count = Math.abs( count );
+       if ( count === 0 || ( count % 100 === 0 || ( count % 100 >= 10 && count % 100 < 20 ) ) ) {
+               return forms[2];
+       }
+       if ( count % 10 === 1 ) {
+               return forms[0];
+       }
+       if ( count % 10 === 2 ) {
+               return forms[1];
+       }
+       return forms[3];
+}
diff --git a/resources/mediawiki.language/languages/be-tarask.js b/resources/mediawiki.language/languages/be-tarask.js
new file mode 100644 (file)
index 0000000..a2bd9cf
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Belarusian in Tara≈°kievica orthography (–ë–µ–ª–∞—Ä—É—Å–∫–∞—è —Ç–∞—Ä–∞—à–∫–µ–≤—ñ—Ü–∞) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length === 2 ) {
+               return count == 1 ? forms[0] : forms[1];
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/be.js b/resources/mediawiki.language/languages/be.js
new file mode 100644 (file)
index 0000000..675c8f1
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Belarusian normative (–ë–µ–ª–∞—Ä—É—Å–∫–∞—è –º–æ–≤–∞) language functions
+ */
+
+mediaWiki.language.convertPlural = function convertPlural( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/bh.js b/resources/mediawiki.language/languages/bh.js
new file mode 100644 (file)
index 0000000..d67c513
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Bihari (भोजपुरी) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/bs.js b/resources/mediawiki.language/languages/bs.js
new file mode 100644 (file)
index 0000000..87d756e
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Bosnian (bosanski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/cs.js b/resources/mediawiki.language/languages/cs.js
new file mode 100644 (file)
index 0000000..0e1837f
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+ * Czech (ƒçe≈°tina [subst.], ƒçesk√Ω [adj.], ƒçesky [adv.]) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       switch ( count ) {
+               case 1:
+                       return forms[0];
+                       break;
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+                       break;
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/cu.js b/resources/mediawiki.language/languages/cu.js
new file mode 100644 (file)
index 0000000..2f05189
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Old Church Slavonic (—®–∑—ã–∫—ä —Å–ª–æ–≤—£–Ω—å—Å–∫—ä) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+                       return forms[1];
+               case 3:
+               case 4:
+                       return forms[2];
+               default:
+                       return forms[3];
+       }
+}
diff --git a/resources/mediawiki.language/languages/cy.js b/resources/mediawiki.language/languages/cy.js
new file mode 100644 (file)
index 0000000..19a3994
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * Welsh (Cymraeg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 6 );
+       count = Math.abs( count );
+       if ( count >= 0 && count <= 3 ) {
+               return forms[count];
+       }
+       if ( count == 6 ) {
+               return forms[4];
+       }
+       return forms[5];
+}
diff --git a/resources/mediawiki.language/languages/dsb.js b/resources/mediawiki.language/languages/dsb.js
new file mode 100644 (file)
index 0000000..e1239e5
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       switch ( Math.abs( count ) % 100 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+                       return forms[1];
+               case 3:
+               case 4:
+                       return forms[2];
+               default:
+                       return forms[3];
+       }
+}
diff --git a/resources/mediawiki.language/languages/fr.js b/resources/mediawiki.language/languages/fr.js
new file mode 100644 (file)
index 0000000..13a86c4
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * French (Fran√ßais) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/ga.js b/resources/mediawiki.language/languages/ga.js
new file mode 100644 (file)
index 0000000..1a53e28
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Irish (Gaeilge) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 2 ) {
+               return forms[1];
+       }
+       return forms[2];
+}
diff --git a/resources/mediawiki.language/languages/gd.js b/resources/mediawiki.language/languages/gd.js
new file mode 100644 (file)
index 0000000..21160d2
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Scots Gaelic (G√†idhlig) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       count = Math.abs( count );
+       if ( count === 1 ) {
+               return forms[0];
+       }
+       if ( count === 2 ) {
+               return forms[1];
+       }
+       if ( count >= 3 && count <= 10 ) {
+               return forms[2];
+       }
+       return forms[3];
+}
diff --git a/resources/mediawiki.language/languages/gv.js b/resources/mediawiki.language/languages/gv.js
new file mode 100644 (file)
index 0000000..7746147
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Manx (Gaelg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       if ( count > 0 && ( count % 20 ) === 0 ) {
+               return forms[0];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[1];
+               case 2:
+                       return forms[2];
+               default:
+                       return forms[3];
+       }
+}
diff --git a/resources/mediawiki.language/languages/he.js b/resources/mediawiki.language/languages/he.js
new file mode 100644 (file)
index 0000000..a96a918
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Hebrew (◊¢◊ë◊®◊ô◊™) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 2 && forms[2] ) {
+               return forms[2];
+       }
+       return forms[1];
+}
diff --git a/resources/mediawiki.language/languages/hi.js b/resources/mediawiki.language/languages/hi.js
new file mode 100644 (file)
index 0000000..7df2cac
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Hindi (हिन्दी) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/hr.js b/resources/mediawiki.language/languages/hr.js
new file mode 100644 (file)
index 0000000..27a0886
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Croatian (hrvatski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/hsb.js b/resources/mediawiki.language/languages/hsb.js
new file mode 100644 (file)
index 0000000..e3bb9c4
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       switch ( Math.abs( count ) % 100 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+                       return forms[1];
+               case 3:
+               case 4:
+                       return forms[2];
+               default:
+                       return forms[3];
+       }
+}
diff --git a/resources/mediawiki.language/languages/hy.js b/resources/mediawiki.language/languages/hy.js
new file mode 100644 (file)
index 0000000..6ec0580
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Armenian (’Ä’°’µ’•÷Ä’•’∂) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/ksh.js b/resources/mediawiki.language/languages/ksh.js
new file mode 100644 (file)
index 0000000..de46ae7
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Ripuarian (Ripoarƒósh) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 0 ) {
+               return forms[2];
+       }
+       return forms[1];
+}
diff --git a/resources/mediawiki.language/languages/ln.js b/resources/mediawiki.language/languages/ln.js
new file mode 100644 (file)
index 0000000..d0c9fdd
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Lingala (Lingála) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/lt.js b/resources/mediawiki.language/languages/lt.js
new file mode 100644 (file)
index 0000000..6b92466
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * Lithuanian (Lietuvi≈≥) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length == 2 ) {
+               return count == 1 ? forms[0] : forms[1];
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count % 10 == 1 && count % 100 != 11 ) {
+               return forms[0];
+       }
+       if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) {
+               return forms[1];                
+       }
+       return forms[2];
+}
diff --git a/resources/mediawiki.language/languages/lv.js b/resources/mediawiki.language/languages/lv.js
new file mode 100644 (file)
index 0000000..d1f595c
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Latvian (Latvie≈°u) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );        
+       return ( ( count % 10 == 1 ) && ( count % 100 != 11 ) ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/mg.js b/resources/mediawiki.language/languages/mg.js
new file mode 100644 (file)
index 0000000..27b833e
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Malagasy (Malagasy) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/mk.js b/resources/mediawiki.language/languages/mk.js
new file mode 100644 (file)
index 0000000..0a8abf1
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Macedonian (Македонски) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count % 10 === 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/mo.js b/resources/mediawiki.language/languages/mo.js
new file mode 100644 (file)
index 0000000..c27b955
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Moldavian (Молдовеняскэ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 0 || count % 100 < 20 ) {
+               return forms[1];
+       }
+       return forms[2];
+}
diff --git a/resources/mediawiki.language/languages/mt.js b/resources/mediawiki.language/languages/mt.js
new file mode 100644 (file)
index 0000000..1e27383
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * Maltese (Malti) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 0 || ( count % 100 > 1 && count % 100 < 11 ) ) {
+               return forms[1];
+       }
+       if ( count % 100 > 10 && count % 100 < 20 ) {
+               return forms[2];
+       }
+       return forms[3];
+}
diff --git a/resources/mediawiki.language/languages/nso.js b/resources/mediawiki.language/languages/nso.js
new file mode 100644 (file)
index 0000000..dac6b6c
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Northern Sotho (Sesotho sa Leboa) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/pl.js b/resources/mediawiki.language/languages/pl.js
new file mode 100644 (file)
index 0000000..4deb76d
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Polish (polski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       count = Math.abs( count );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       switch ( count % 10 ) {
+               case 2:
+               case 3:
+               case 4:
+                       if ( count / 10 % 10 != 1 ) {
+                               return forms[1];
+                       }
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/pt-br.js b/resources/mediawiki.language/languages/pt-br.js
new file mode 100644 (file)
index 0000000..ea511c1
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Brazilian Portugese (Portugu√™si do Brasil) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/ro.js b/resources/mediawiki.language/languages/ro.js
new file mode 100644 (file)
index 0000000..9ab350c
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Romanian (Română) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 0 || count % 100 < 20 ) {
+               return forms[1];
+       }
+       return forms[2];
+}
diff --git a/resources/mediawiki.language/languages/ru.js b/resources/mediawiki.language/languages/ru.js
new file mode 100644 (file)
index 0000000..9da0394
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Russian (—Ä—É—Å—Å–∫–∏–π —è–∑—ã–∫) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length === 2 ) {
+               return count == 1 ? forms[0] : forms[1];                
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/se.js b/resources/mediawiki.language/languages/se.js
new file mode 100644 (file)
index 0000000..002644f
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * Northern Sami (Sámegiella) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( count == 0 ) {
+               return '';
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[1];
+       }
+       if ( count == 2 ) {
+               return forms[2];
+       }
+       return ''
+}
diff --git a/resources/mediawiki.language/languages/sh.js b/resources/mediawiki.language/languages/sh.js
new file mode 100644 (file)
index 0000000..49af56c
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Serbo-Croatian (Srpskohrvatski / Српскохрватски) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length === 2 ) {
+               return count == 1 ? forms[0] : forms[1];
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/sk.js b/resources/mediawiki.language/languages/sk.js
new file mode 100644 (file)
index 0000000..1acd2ec
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Slovak (Slovenƒçina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count == 1 ) {
+               return forms[0];
+       }
+       if ( count == 2 || count == 3 || count == 4 ) {
+               return forms[1];
+       }
+       return forms[2];
+}
diff --git a/resources/mediawiki.language/languages/sl.js b/resources/mediawiki.language/languages/sl.js
new file mode 100644 (file)
index 0000000..27557d4
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Slovenian (Sloven≈°ƒçina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 5 );
+       if ( count % 100 == 1 ) {
+               return forms[0];
+       }
+       if ( count % 100 == 2 ) {
+               return forms[1];
+       }
+       if ( count % 100 == 3 || count % 100 == 4 ) {
+               return forms[2];
+       }
+       if ( count != 0 ) {
+               return forms[3];
+       }
+       return forms[4];
+}
diff --git a/resources/mediawiki.language/languages/sma.js b/resources/mediawiki.language/languages/sma.js
new file mode 100644 (file)
index 0000000..59c1dcf
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Southern Sami (Åarjelsaemien) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 4 );
+       if ( count == 1 ) {
+               return forms[1];
+       }
+       if ( count == 2 ) {
+               return forms[2];
+       }
+       return forms[3];
+}
diff --git a/resources/mediawiki.language/languages/sr-ec.js b/resources/mediawiki.language/languages/sr-ec.js
new file mode 100644 (file)
index 0000000..7b92bf6
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Serbian (cyrillic script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/sr-el.js b/resources/mediawiki.language/languages/sr-el.js
new file mode 100644 (file)
index 0000000..f8189f3
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * Serbian (latin script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/sr.js b/resources/mediawiki.language/languages/sr.js
new file mode 100644 (file)
index 0000000..25cdc8a
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Serbian (Српски / Srpski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length === 2 ) {
+               return ( count == 1 ) ? forms[0] : forms[1];
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+};
diff --git a/resources/mediawiki.language/languages/ti.js b/resources/mediawiki.language/languages/ti.js
new file mode 100644 (file)
index 0000000..ca81a31
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Tigrinya (ትግርኛ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural(forms, 2);
+       return (count <= 1) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/tl.js b/resources/mediawiki.language/languages/tl.js
new file mode 100644 (file)
index 0000000..317d578
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Tagalog (Tagalog) language functions
+ */
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/languages/uk.js b/resources/mediawiki.language/languages/uk.js
new file mode 100644 (file)
index 0000000..651e655
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * Ukrainian (—É–∫—Ä–∞—ó–Ω—Å—å–∫–∞ –º–æ–≤–∞) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       if ( forms.length === 2 ) {
+               return count == 1 ? forms[0] : forms[1];                
+       }
+       forms = mediaWiki.language.preConvertPlural( forms, 3 );
+       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+               return forms[2];
+       }
+       switch ( count % 10 ) {
+               case 1:
+                       return forms[0];
+               case 2:
+               case 3:
+               case 4:
+                       return forms[1];
+               default:
+                       return forms[2];
+       }
+}
diff --git a/resources/mediawiki.language/languages/wa.js b/resources/mediawiki.language/languages/wa.js
new file mode 100644 (file)
index 0000000..c58989c
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Walloon (Walon) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+       forms = mediaWiki.language.preConvertPlural( forms, 2 );
+       return ( count <= 1 ) ? forms[0] : forms[1];
+}
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
new file mode 100644 (file)
index 0000000..0c89509
--- /dev/null
@@ -0,0 +1,99 @@
+/**
+ * Base language object
+ * 
+ * Localized Language support attempts to mirror some of the functionality of Language.php in MediaWiki. This object
+ * contains methods for loading and transforming message text.
+ */
+
+mediaWiki.language = {
+       /**
+        * Process the PLURAL template substitution 
+        * 
+        * @param {object} template Template object 
+        * @format template
+        *      {
+        *              'title': [title of template],
+        *              'parameters': [template parameters]
+        *      }
+        * @example {{Template:title|params}}
+        */
+       'procPLURAL': function( template ) {
+               if( template.title && template.parameters && mediaWiki.language.convertPlural) {
+                       // Check if we have forms to replace
+                       if ( template.parameters.length == 0 ) { 
+                               return '';
+                       }
+                       // Restore the count into a Number ( if it got converted earlier )
+                       var count = mediaWiki.language.convertNumber( template.title, true );
+                       // Do convertPlural call                                        
+                       return mediaWiki.language.convertPlural( parseInt( count ), template.parameters );
+               }
+               // Could not process plural return first form or nothing
+               if( template.parameters[0] ) {
+                       return template.parameters[0];
+               }
+               return '';
+       },
+       /**
+        * Plural form transformations, needed for some languages.
+        * 
+        * @param {integer} count Non-localized quantifier
+        * @param {array} forms List of plural forms
+        * @return {string} Correct form for quantifier in this language
+        */
+       'convertPlural': function( count, forms ){      
+               if ( !forms || forms.length == 0 ) { 
+                       return ''; 
+               }       
+               return ( parseInt( count ) == 1 ) ? forms[0] : forms[1];
+       },
+       /**
+        * Pads an array to a specific length by copying the last one element.
+        * 
+        * @param {array} forms Number of forms given to convertPlural
+        * @param {integer} count Number of forms required
+        * @return {array} Padded array of forms
+        */
+       'preConvertPlural': function( forms, count ) {
+               while ( forms.length < count ) {
+                       forms.push( forms[ forms.length-1 ] );
+               }               
+               return forms;
+       },
+       /**
+        * Converts a number using digitTransformTable.
+        * 
+        * @param {number} number Value to be converted
+        * @param {boolean} integer Convert the return value to an integer
+        */
+       'convertNumber': function( number, integer ) {
+               if ( !mediaWiki.language.digitTransformTable ) {
+                       return number;
+               }
+               // Set the target Transform table: 
+               var transformTable = mediaWiki.language.digitTransformTable;
+               // Check if the "restore" to Latin number flag is set: 
+               if ( integer ) {                        
+                       if ( parseInt( number ) == number )     {
+                               return number;
+                       }
+                       var tmp = [];
+                       for ( var i in transformTable ) {
+                               tmp[ transformTable[ i ] ] = i;
+                       }
+                       transformTable = tmp;
+               }
+               var numberString =  '' + number;
+               var convertedNumber = '';
+               for ( var i = 0; i < numberString.length; i++ ) {
+                       if ( transformTable[ numberString[i] ] ) {
+                               convertedNumber += transformTable[numberString[i]];
+                       } else {
+                               convertedNumber += numberString[i];
+                       }
+               }
+               return integer ? parseInt( convertedNumber) : convertedNumber;
+       },
+       // Digit Transform Table, populated by language classes where applicable
+       'digitTransformTable': null
+};
diff --git a/resources/mediawiki.specials/mediawiki.specials.preferences.js b/resources/mediawiki.specials/mediawiki.specials.preferences.js
new file mode 100644 (file)
index 0000000..e6760fc
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * JavaScript for Special:Preferences
+ */
+
+$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+$( '#preferences' )
+       .addClass( 'jsprefs' )
+       .before( $( '<ul id="preftoc"></ul>' ) )
+       .children( 'fieldset' )
+       .hide()
+       .addClass( 'prefsection' )
+       .children( 'legend' )
+       .addClass( 'mainLegend' )
+       .each( function( i ) {
+               $(this).parent().attr( 'id', 'prefsection-' + i );
+               if ( i === 0 ) {
+                       $(this).parent().show();
+               }
+               $( '#preftoc' ).append(
+                       $( '<li></li>' )
+                               .addClass( i === 0 ? 'selected' : null )
+                               .append(
+                                       $( '<a></a>')
+                                               .text( $(this).text() )
+                                               .attr( 'href', '#prefsection-' + i )
+                                               .mousedown( function( e ) {
+                                                       $(this).parent().parent().find( 'li' ).removeClass( 'selected' );
+                                                       $(this).parent().addClass( 'selected' );
+                                                       e.preventDefault();
+                                                       return false;
+                                               } )
+                                               .click( function( e ) {
+                                                       $( '#preferences > fieldset' ).hide();
+                                                       $( '#prefsection-' + i ).show();
+                                                       e.preventDefault();
+                                                       return false;
+                                               } )
+                               )
+               );
+       } );
diff --git a/resources/mediawiki.specials/mediawiki.specials.search.js b/resources/mediawiki.specials/mediawiki.specials.search.js
new file mode 100644 (file)
index 0000000..1b56857
--- /dev/null
@@ -0,0 +1,8 @@
+/*
+ * JavaScript for Specical:Search
+ */
+
+// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+       $( 'input[autofocus]' ).focus();
+}
diff --git a/resources/mediawiki.util/mediawiki.util.js b/resources/mediawiki.util/mediawiki.util.js
new file mode 100644 (file)
index 0000000..f7a6774
--- /dev/null
@@ -0,0 +1,314 @@
+/*
+ * Utilities
+ */
+
+(function ($, mw) {
+
+       mediaWiki.util = {
+
+               /* Initialisation */
+               'initialised' : false,
+               'init' : function () {
+                       if (this.initialised === false) {
+                               this.initialised = true;
+
+                               // Set tooltipAccessKeyPrefix
+                               if (is_opera) {
+                                       this.tooltipAccessKeyPrefix = 'shift-esc-';
+                               } else if (is_chrome) {
+                                       this.tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
+                               } else if (!is_safari_win && is_safari && webkit_version > 526) {
+                                       this.tooltipAccessKeyPrefix = 'ctrl-alt-';
+                               } else if (!is_safari_win &&
+                                       (is_safari || clientPC.indexOf('mac') !== -1 || clientPC.indexOf('konqueror') !== -1)) {
+                                       this.tooltipAccessKeyPrefix = 'ctrl-';
+                               } else if (is_ff2) {
+                                       this.tooltipAccessKeyPrefix = 'alt-shift-';
+                               }
+
+                               // Setup CheckboxShiftClick
+                               $.fn.enableCheckboxShiftClick = function () {
+                                       var prevCheckbox = null;
+                                       var $box = this;
+                                       $box.click(function (e) {
+                                               if (prevCheckbox !== null && e.shiftKey) {
+                                                       $box.slice(
+                                                         Math.min($box.index(prevCheckbox), $box.index(e.target)),
+                                                         Math.max($box.index(prevCheckbox), $box.index(e.target)) + 1
+                                                       ).attr({checked: e.target.checked ? 'checked' : ''});
+                                               }
+                                               prevCheckbox = e.target;
+                                       });
+                                       return $box;
+                               };
+
+                               // Prototype enhancements
+                               if (typeof String.prototype.ucFirst === 'undefined') {
+                                       String.prototype.ucFirst = function () {
+                                               return this.substr(0, 1).toUpperCase() + this.substr(1, this.length);
+                                       };
+                               }
+
+                               // Any initialisation after the DOM is ready
+                               $(function () {
+                               
+                                       // Enable CheckboxShiftClick
+                                       $('input[type=checkbox]:not(.noshiftselect)').enableCheckboxShiftClick();
+                                       
+                                       // Fill bodyContant var
+                                       if ($('#bodyContent').length) {
+                                               mw.util.$content = $('#bodyContent');
+                                       } else if ($('#article').length) {
+                                               mw.util.$content = $('#article');
+                                       } else {
+                                               mw.util.$content = $('#content');
+                                       }
+                               });
+
+
+                               return true;
+                       }
+                       return false;
+               },
+
+               /* Main body */
+
+               /**
+               * Encodes the string like PHP's rawurlencode
+               *
+               * @param String str             string to be encoded
+               */
+               'rawurlencode' : function (str) {
+                       str = (str + '').toString();
+                       return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28')
+                               .replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/~/g, '%7E');
+               },
+
+               /**
+               * Encode pagetitles for use in a URL
+               * We want / and : to be included as literal characters in our title URLs
+               * as they otherwise fatally break the title
+               *
+               * @param String str             string to be encoded
+               */
+               'wikiUrlencode' : function (str) {
+                       return this.rawurlencode(str).replace(/%20/g, '_').replace(/%3A/g, ':').replace(/%2F/g, '/');
+               },
+
+               /**
+               * Get the full url to a pagename
+               *
+               * @param String str             pagename to link to
+               */
+               'getWikilink' : function (str) {
+                       return wgServer + wgArticlePath.replace('$1', this.wikiUrlencode(str));
+               },
+
+               /**
+               * Check is a variable is empty. Support for strings, booleans, arrays and objects.
+               * String "0" is considered empty. String containing only whitespace (ie. "  ") is considered not empty.
+               *
+               * @param Mixed v        the variable to check for empty ness
+               */
+               'isEmpty' : function (v) {
+                       var key;
+                       if (v === "" || v === 0 || v === "0" || v === null || v === false || typeof v === 'undefined') {
+                               return true;
+                       }
+                       if (v.length === 0) {
+                               return true;
+                       }
+                       if (typeof v === 'object') {
+                               for (key in v) {
+                                       return false;
+                               }
+                               return true;
+                       }
+                       return false;
+               },
+
+
+               /**
+               * Grabs the url parameter value for the given parameter
+               * Returns null if not found
+               *
+               * @param String param   paramter name
+               * @param String url             url to search through (optional)
+               */
+               'getParamValue' : function (param, url) {
+                       url = url ? url : document.location.href;
+                       var re = new RegExp('[^#]*[&?]' + param + '=([^&#]*)'); // Get last match, stop at hash
+                       var m = re.exec(url);
+                       if (m && m.length > 1) {
+                               return decodeURIComponent(m[1]);
+                       }
+                       return null;
+               },
+
+               /**
+               * Converts special characters to their HTML entities
+               *
+               * @param String                 str text to escape
+               * @param Bool                   quotes if true escapes single and double quotes aswell (by default false)
+               */
+               'htmlEscape' : function (str, quotes) {
+                       str = $('<div/>').text(str).html();
+                       if (typeof quotes === 'undefined') {
+                               quotes = false;
+                       }
+                       if (quotes === true) {
+                               str = str.replace(/'/g, '&#039;').replace(/"/g, '&quot;');
+                       }
+                       return str;
+               },
+
+               /**
+               * Converts HTML entities back to text
+               *
+               * @param String str             text to unescape
+               */
+               'htmlUnescape' : function (str) {
+                       return $('<div/>').html(str).text();
+               },
+
+               // Access key prefix
+               // will be re-defined based on browser/operating system detection in mw.util.init()
+               'tooltipAccessKeyPrefix' : 'alt-',
+
+               // Regex to match accesskey tooltips
+               'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+
+               /**
+                * Add the appropriate prefix to the accesskey shown in the tooltip.
+                * If the nodeList parameter is given, only those nodes are updated;
+                * otherwise, all the nodes that will probably have accesskeys by
+                * default are updated.
+                *
+                * @param Mixed nodeList        jQuery object, or array of elements
+                */
+               'updateTooltipAccessKeys' : function (nodeList) {
+                       var $nodes;
+                       if (nodeList instanceof jQuery) {
+                               $nodes = nodeList;
+                       } else if (nodeList) {
+                               $nodes = $(nodeList);
+                       } else {
+                               // Rather than scanning all links, just
+                               $('#column-one a, #mw-head a, #mw-panel a, #p-logo a');
+
+                               // these are rare enough that no such optimization is needed
+                               this.updateTooltipAccessKeys($('input'));
+                               this.updateTooltipAccessKeys($('label'));
+                               return;
+                       }
+
+                       $nodes.each(function (i) {
+                               var tip = $(this).attr('title');
+                               if (!!tip && mw.util.tooltipAccessKeyRegexp.exec(tip)) {
+                                       tip = tip.replace(mw.util.tooltipAccessKeyRegexp, '[' + mw.util.tooltipAccessKeyPrefix + "$5]");
+                                       $(this).attr('title', tip);
+                               }
+                       });
+               },
+               
+               // jQuery object that refers to the page-content element
+               // Populated by init()
+               '$content' : null,
+
+
+               /**
+                * Add a link to a portlet menu on the page, such as:
+                *
+                * p-cactions (Content actions), p-personal (Personal tools), p-navigation (Navigation), p-tb (Toolbox)
+                *
+                * The first three paramters are required, others are optionals. Though
+                * providing an id and tooltip is recommended.
+                *
+                * By default the new link will be added to the end of the list. To add the link before a given existing item,
+                * pass the DOM node (document.getElementById('foobar') or the jQuery-selector ('#foobar') of that item.
+                *
+                * @example mw.util.addPortletLink('p-tb', 'http://mediawiki.org/', 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print')
+                *
+                * @param String portlet        id of the target portlet ('p-cactions' or 'p-personal' etc.)
+                * @param String href           link URL
+                * @param String text           link text (will be automatically lowercased by CSS for p-cactions in Monobook)
+                * @param String id                     id of the new item, should be unique and preferably have the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
+                * @param String tooltip        text to show when hovering over the link, without accesskey suffix
+                * @param String accesskey      accesskey to activate this link (one character, try to avoid conflicts. Use $('[accesskey=x').get() in the console to see if 'x' is already used.
+                * @param mixed nextnode        DOM node or jQuery-selector of the item that the new item should be added before, should be another item in the same list will be ignored if not the so
+                *
+                * @return Node                         the DOM node of the new item (a LI element, or A element for older skins) or null
+                */
+               'addPortletLink' : function (portlet, href, text, id, tooltip, accesskey, nextnode) {
+                       var $link = $('<a />').attr('href', href).text(text);
+                       
+                       // Some skins don't have portlets
+                       // Just add it to the bottom of their 'sidebar' element ignoring the specified portlet target
+                       switch (skin) {
+                       case 'standard' :
+                       case 'cologneblue' :
+                               $("#quickbar").append($link.after('<br />'));
+                               return $link.get(0);
+                       case 'nostalgia' :
+                               $("#searchform").before($link).before(' &#124; ');
+                               return $link.get(0);
+                       default : // chick, modern, monobook, myskin, simple, vector...
+                               
+                               var $portlet = $('#' + portlet);
+                               if ($portlet.length === 0) {
+                                       return null;
+                               }
+                               var $ul = $portlet.find('ul').eq(0);
+                               if ($ul.length === 0) {
+                                       if ($portlet.find('div').length === 0) {
+                                               $portlet.append('<ul />');
+                                       } else {
+                                               $portlet.find('div').eq(-1).append('<ul />');
+                                       }
+                                       $ul = $portlet.find('ul').eq(0);
+                               }
+                               if ($ul.length === 0) {
+                                       return null;
+                               }
+       
+                               // unhide portlet if it was hidden before
+                               $portlet.removeClass('emptyPortlet');
+                               
+                               var $item = $link.wrap('<li><span /></li>').parent().parent();
+
+                               if (id) {
+                                       $item.attr('id', id);
+                               }
+                               if (accesskey) {
+                                       $link.attr('accesskey', accesskey);
+                                       tooltip += ' [' + accesskey + ']';
+                               }
+                               if (tooltip) {
+                                       $link.attr('title', tooltip);
+                               }
+                               if (accesskey && tooltip) {
+                                       this.updateTooltipAccessKeys($link);
+                               }
+       
+                               // Append using DOM-element passing
+                               if (nextnode && nextnode.parentNode == $ul.get(0)) {
+                                       $(nextnode).before($item);
+                               } else {
+                                       // If the jQuery selector isn't found within the <ul>, just append it at the end
+                                       if ($ul.find(nextnode).length === 0) {
+                                               $ul.append($item);
+                                       } else {
+                                               // Append using jQuery CSS selector
+                                               $ul.find(nextnode).eq(0).before($item);
+                                       }
+                               }
+       
+                               return $item.get(0);
+                       }
+               }
+
+       };
+
+       mediaWiki.util.init();
+
+})(jQuery, mediaWiki);
\ No newline at end of file
diff --git a/resources/mediawiki.util/mediawiki.util.test.js b/resources/mediawiki.util/mediawiki.util.test.js
new file mode 100644 (file)
index 0000000..5122dbf
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * mediaWiki Debug Test Suit.
+ * Available on "/Special:BlankPage?action=mwutiltest&debug=true")
+ */
+
+(function ($, mw) {
+
+       mediaWiki.test = {
+
+               /* Variables */
+               '$table' : null,
+               'addedTests' : [],
+
+               /* Functions */
+
+               /**
+               * Adds a row to the test-table
+               *
+               * @param String code    Code of the test to be executed
+               * @param String result  Expected result in 'var (vartype)' form
+               * @param String contain Important part of the result, if result is different but does contain this it will not return ERROR but PARTIALLY
+               */
+               'addTest' : function (code, result, contain) {
+                       if (!contain) {
+                               contain = result;
+                       }
+                       this.addedTests.push([code, result, contain]);
+                       this.$table.append('<tr><td>' + mw.util.htmlEscape(code) + '</td><td>' + mw.util.htmlEscape(result) + '<td></td></td><td>?</td></tr>');
+               },
+
+               /* Initialisation */
+               'initialised' : false,
+               'init' : function () {
+                       if (this.initialised === false) {
+                               this.initialised = true;
+                               $(function () {
+                                       if (wgCanonicalSpecialPageName == 'Blankpage' && mw.util.getParamValue('action') === 'mwutiltest') {
+
+                                               // Build page
+                                               document.title = 'mediaWiki.util JavaScript Test - ' + wgSiteName;
+                                               $('#firstHeading').text('mediaWiki.util JavaScript Test');
+                                               mw.util.$content.html(
+                                                       '<p>Below is a list of tests to confirm proper functionality of the mediaWiki.util functions</p>' +
+                                                       '<hr />' +
+                                                       '<table id="mw-mwutiltest-table" class="wikitable sortable"><tr><th>Exec</th><th>Should return</th><th>Does return</th><th>Equal ?</th></tr></table>'
+                                               );
+                                               mw.test.$table = $('table#mw-mwutiltest-table');
+
+                                               // Populate tests
+                                               mw.test.addTest('typeof String.prototype.trim',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof String.prototype.trimLeft',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof String.prototype.trimRight',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof Array.prototype.compare',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof Array.prototype.indexOf',
+                                                       'function (string)');
+                                               mw.test.addTest('4',
+                                                       '4 (number)');
+                                               mw.test.addTest('typeof mediaWiki',
+                                                       'object (string)');
+                                               mw.test.addTest('typeof mw',
+                                                       'object (string)');
+                                               mw.test.addTest('typeof mw.util',
+                                                       'object (string)');
+                                               mw.test.addTest('typeof String.prototype.ucFirst',
+                                                       'function (string)');
+                                               mw.test.addTest('\'mediawiki\'.ucFirst()',
+                                                       'Mediawiki (string)');
+                                               mw.test.addTest('typeof $.fn.enableCheckboxShiftClick',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof mw.util.rawurlencode',
+                                                       'function (string)');
+                                               mw.test.addTest('mw.util.rawurlencode(\'Test: A&B/Here\')',
+                                                       'Test%3A%20A%26B%2FHere (string)');
+                                               mw.test.addTest('typeof mw.util.getWikilink',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof mw.util.getParamValue',
+                                                       'function (string)');
+                                               mw.test.addTest('mw.util.getParamValue(\'action\')',
+                                                       'mwutiltest (string)');
+                                               mw.test.addTest('typeof mw.util.htmlEscape',
+                                                       'function (string)');
+                                               mw.test.addTest('mw.util.htmlEscape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
+                                                       '&lt;a href="http://mw.org/?a=b&amp;c=d"&gt;link&lt;/a&gt; (string)');
+                                               mw.test.addTest('typeof mw.util.htmlUnescape',
+                                                       'function (string)');
+                                               mw.test.addTest('mw.util.htmlUnescape(\'&lt;a href="http://mw.org/?a=b&amp;c=d"&gt;link&lt;/a&gt;\')',
+                                                       '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
+                                               mw.test.addTest('typeof mw.util.tooltipAccessKeyRegexp',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof mw.util.updateTooltipAccessKeys',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof mw.util.addPortletLink',
+                                                       'function (string)');
+                                               mw.test.addTest('typeof mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print")',
+                                                       'object (string)');
+                                               mw.test.addTest('a = mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print"); if(a){ a.outerHTML; }',
+                                                       '<li id="t-mworg"><span><a href="http://mediawiki.org/" accesskey="m" title="Go to MediaWiki.org  [ctrl-alt-m]">MediaWiki.org</a></span></li> (string)',
+                                                       'href="http://mediawiki.org/"');
+
+                                               // Run tests and compare results
+                                               var     exec,
+                                                       result,
+                                                       resulttype,
+                                                       numberoftests = 0,
+                                                       numberofpasseds = 0,
+                                                       numberofpartials = 0,
+                                                       numberoferrors = 0,
+                                                       $testrows;
+                                               $testrows = mw.test.$table.find('tr');
+                                               $.each(mw.test.addedTests, (function (i) {
+                                                               numberoftests++;
+                                                               
+                                                               exec = mw.test.addedTests[i][0];
+                                                               shouldreturn = mw.test.addedTests[i][1];
+                                                               shouldcontain = mw.test.addedTests[i][2];
+                                                               doesreturn = eval(exec);
+                                                               doesreturn = doesreturn + ' (' + typeof doesreturn + ')';
+                                                               $thisrow = $testrows.eq(i + 1);
+                                                               $thisrow.find('> td').eq(2).text(doesreturn);
+                                                               
+                                                               if (doesreturn.indexOf(shouldcontain) !== -1) {
+                                                                       if (doesreturn == shouldreturn){
+                                                                               $thisrow.find('> td').eq(3).css('background', '#EFE').text('OK');
+                                                                               numberofpasseds++;
+                                                                       } else {
+                                                                               $thisrow.find('> td').eq(3).css('background', '#FFE').html('<small>PARTIALLY</small>');
+                                                                               numberofpartials++;
+                                                                       }
+                                                               } else {
+                                                                       $thisrow.find('> td').eq(3).css('background', '#FEE').text('ERROR');
+                                                                       numberoferrors++;
+                                                               }
+
+                                                       })
+                                               );
+                                               mw.test.$table.before('<p><strong>Ran ' + numberoftests + ' tests. ' + numberofpasseds + ' passed test(s). ' + numberoferrors + ' error(s). ' + numberofpartials + ' partially passed test(s). </p>');
+
+                                       }
+                               });
+                       }
+               }
+       };
+
+       mediaWiki.test.init();
+
+})(jQuery, mediaWiki);
\ No newline at end of file
diff --git a/resources/mediawiki.views/mediawiki.views.history.js b/resources/mediawiki.views/mediawiki.views.history.js
new file mode 100644 (file)
index 0000000..d85e597
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+ * JavaScript for History view
+ */
+
+// Replaces histrowinit
+$( '#pagehistory li input[name=diff], #pagehistory li input[name=oldid]' ).click( diffcheck );
+diffcheck();
\ No newline at end of file
index 3d3e82d..7bef469 100644 (file)
  */
 
 // New fallback String trimming functionality, was introduced natively in JavaScript 1.8.1
-if (typeof String.prototype.trim === 'undefined') {
-// Add removing trailing and leading whitespace functionality cross-browser
-// See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript
-       String.prototype.trim = function () {
-               return this.replace(/^\s+|\s+$/g, '');
+if ( typeof String.prototype.trim === 'undefined' ) {
+       // Add removing trailing and leading whitespace functionality cross-browser
+       // See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript
+       String.prototype.trim = function() {
+               return this.replace( /^\s+|\s+$/g, '' );
        };
 }
-if (typeof String.prototype.trimLeft === 'undefined') {
-       String.prototype.trimLeft = function () {
-               return this.replace(/^\s\s*/, "");
+if ( typeof String.prototype.trimLeft === 'undefined' ) {
+       String.prototype.trimLeft = function() {
+               return this.replace( /^\s\s*/, "" );
        };
 }
 
-if (typeof String.prototype.trimRight === 'undefined') {
-       String.prototype.trimRight = function () {
+if ( typeof String.prototype.trimRight === 'undefined' ) {
+       String.prototype.trimRight = function() {
                return this.replace(/\s\s*$/, "");
        };
 }
 
-// Add array comparison functionality
-if (typeof Array.prototype.compare === 'undefined') {
-       Array.prototype.compare = function (against) {
-               if (this.length !== against.length) {
-                       return false;
-               }
-               for (var i = 0; i < against.length; i++) {
-                       if (this[i].compare) {
-                               if (!this[i].compare(against[i])) {
-                                       return false;
-                               }
-                       }
-                       if (this[i] !== against[i]) {
-                               return false;
-                       }
-               }
-               return true;
-       };
-}
-
-// Make calling .indexOf() on an array work on older browsers
-if (typeof Array.prototype.indexOf === 'undefined') {
-       Array.prototype.indexOf = function (needle) {
-               for (var i = 0; i < this.length; i++) {
-                       if (this[i] === needle) {
-                               return i;
-                       }
-               }
-               return -1;
-       };
-}
-
 /*
  * Core MediaWiki JavaScript Library
  */
+
 // Attach to window
 window.mediaWiki = new ( function( $ ) {
-
+       
        /* Constants */
-
+       
        // This will not change until we are 100% ready to turn off legacy globals
        var LEGACY_GLOBALS = true;
-
+       
        /* Private Members */
-
-       var that = this;
-
+       
+       // List of messages that have been requested to be loaded
+       var messageQueue = {};
+       
        /* Prototypes */
-
-       this.prototypes = {
-               /*
-                * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs
-                *
-                * @param {boolean} global whether to get/set/exists values on the window object or a private object
-                * @param {function} parser function to perform extra processing; in the form of function( value, options )
-                * @param {function} fallback function to format default fallback; in the form of function( key )
-                * where value is the data to be parsed and options is additional data passed through to the parser
-                */
-               'map': function( global, parser, fallback ) {
-
-                       /* Private Members */
-
-                       var that = this;
-                       var values = global === true ? window : {};
-
-                       /* Public Methods */
-
-                       /**
-                        * Gets one or more values
-                        *
-                        * If called with no arguments, all values will be returned. If a parser is in use, no parsing will take
-                        * place when calling with no arguments or calling with an array of names.
-                        *
-                        * @param {mixed} selection string name of value to get, array of string names of values to get, or object
-                        * of name/option pairs
-                        * @param {object} options optional set of options which are also passed to a parser if in use; only used
-                        * when selection is a string
-                        * @format options
-                        *      {
-                        *              // Value to use if key does not exist
-                        *              'fallback': ''
-                        *      }
-                        */
-                       this.get = function( selection, options ) {
-                               if ( typeof selection === 'object' ) {
-                                       var results = {};
-                                       for ( var s in selection ) {
-                                               if ( selection.hasOwnProperty( s ) ) {
-                                                       if ( typeof s === 'string' ) {
-                                                               return that.get( values[s], selection[s] );
-                                                       } else {
-                                                               return that.get( selection[s] );
-                                                       }
-                                               }
-                                       }
-                                       return results;
-                               } else if ( typeof selection === 'string' ) {
-                                       if ( typeof values[selection] === 'undefined' ) {
-                                               if ( typeof options === 'object' && 'fallback' in options ) {
-                                                       return options.fallback;
-                                               } else if ( typeof fallback === 'function' ) {
-                                                       return fallback( selection );
-                                               } else {
-                                                       return null;
-                                               }
-                                       } else {
-                                               if ( typeof parser === 'function' ) {
-                                                       return parser( values[selection], options );
-                                               } else {
-                                                       return values[selection];
-                                               }
-                                       }
-                               } else {
-                                       return values;
-                               }
-                       };
-
-                       /**
-                        * Sets one or multiple configuration values using a key and a value or an object of keys and values
-                        *
-                        * @param {mixed} key string of name by which value will be made accessible, or object of name/value pairs
-                        * @param {mixed} value optional value to set, only in use when key is a string
-                        */
-                       this.set = function( selection, value ) {
-                               if ( typeof selection === 'object' ) {
-                                       for ( var s in selection ) {
-                                               values[s] = selection[s];
-                                       }
-                               } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) {
-                                       values[selection] = value;
+       
+       /**
+        * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs.
+        * 
+        * @param {boolean} global Whether to get/set/exists values on the window object or a private object
+        */
+       function Map( global ) {
+               this.values = ( global === true ) ? window : {};
+       };
+       
+       /**
+        * Gets the value of a key, or a list of key/value pairs for an array of keys.
+        * 
+        * If called with no arguments, all values will be returned.
+        * 
+        * @param {mixed} selection Key or array of keys to get values for
+        * @param {mixed} fallback Value to use in case key(s) do not exist (optional)
+        */
+       Map.prototype.get = function( selection, fallback ) {
+               if ( typeof selection === 'object' ) {
+                       selection = $.makeArray( selection );
+                       var results = {};
+                       for ( var i = 0; i < selection.length; i++ ) {
+                               results[selection[i]] = this.get( selection[i], fallback );
+                       }
+                       return results;
+               } else if ( typeof selection === 'string' ) {
+                       if ( typeof this.values[selection] === 'undefined' ) {
+                               if ( typeof fallback !== 'undefined' ) {
+                                       return fallback;
                                }
-                       };
-
-                       /**
-                        * Checks if one or multiple configuration fields exist
-                        */
-                       this.exists = function( selection ) {
-                               if ( typeof keys === 'object' ) {
-                                       for ( var s = 0; s < selection.length; s++ ) {
-                                               if ( !( selection[s] in values ) ) {
-                                                       return false;
-                                               }
-                                       }
-                                       return true;
-                               } else {
-                                       return selection in values;
+                               return null;
+                       }
+                       return this.values[selection];
+               }
+               return this.values;
+       };
+       
+       /**
+        * Sets one or multiple key/value pairs.
+        * 
+        * @param {mixed} selection Key or object of key/value pairs to set
+        * @param {mixed} value Value to set (optional, only in use when key is a string)
+        */
+       Map.prototype.set = function( selection, value ) {
+               if ( typeof selection === 'object' ) {
+                       for ( var s in selection ) {
+                               this.values[s] = selection[s];
+                       }
+               } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) {
+                       this.values[selection] = value;
+               }
+       };
+       
+       /**
+        * Checks if one or multiple keys exist.
+        * 
+        * @param {mixed} key Key or array of keys to check
+        * @return {boolean} Existence of key(s)
+        */
+       Map.prototype.exists = function( selection ) {
+               if ( typeof keys === 'object' ) {
+                       for ( var s = 0; s < selection.length; s++ ) {
+                               if ( !( selection[s] in this.values ) ) {
+                                       return false;
                                }
-                       };
+                       }
+                       return true;
+               } else {
+                       return selection in this.values;
                }
        };
-
-       /* Methods */
+       
+       /**
+        * Message object, similar to Message in PHP 
+        */
+       function Message( map, key, parameters ) {
+               this.format = 'parse';
+               this.map = map;
+               this.key = key;
+               this.parameters = typeof parameters === 'undefined' ? [] : $.makeArray( parameters );
+       };
+       
+       /**
+        * Appends parameters for replacement
+        * 
+        * @param {mixed} args First in a list of variadic arguments to append as message parameters
+        */
+       Message.prototype.params = function( parameters ) {
+               for ( var i = 0; i < parameters.length; i++ ) {
+                       this.parameters[this.parameters.length] = parameters[i];
+               }
+               return this;
+       };
+       
+       /**
+        * Converts message object to it's string form based on the state of format
+        * 
+        * @return {string} String form of message
+        */
+       Message.prototype.toString = function() {
+               if ( !this.map.exists( this.key ) ) {
+                       // Return <key> if key does not exist
+                       return '<' + key + '>';
+               }
+               var text = this.map.get( this.key );
+               var parameters = this.parameters;
+               text = text.replace( /\$(\d+)/g, function( string, match ) {
+                       var index = parseInt( match, 10 ) - 1;
+                       return index in parameters ? parameters[index] : '$' + match;
+               } );
+               /* This should be fixed up when we have a parser
+               if ( this.format === 'parse' && 'language' in mediaWiki ) {
+                       text = mediaWiki.language.parse( text );
+               }
+               */
+               return text;
+       };
+       
+       /**
+        * Changes format to parse and converts message to string
+        * 
+        * @return {string} String form of parsed message
+        */
+       Message.prototype.parse = function() {
+               this.format = 'parse';
+               return this.toString();
+       };
+       
+       /**
+        * Changes format to plain and converts message to string
+        * 
+        * @return {string} String form of plain message
+        */
+       Message.prototype.plain = function() {
+               this.format = 'plain';
+               return this.toString();
+       };
+       
+       /**
+        * Checks if message exists
+        * 
+        * @return {string} String form of parsed message
+        */
+       Message.prototype.exists = function() {
+               return this.map.exists( this.key );
+       };
+       
+       /**
+        * User object
+        */
+       function User() {
+               this.options = new Map();
+       }
+       
+       /* Public Members */
 
        /*
         * Dummy function which in debug mode can be replaced with a function that does something clever
@@ -185,37 +207,38 @@ window.mediaWiki = new ( function( $ ) {
         *
         * In legacy mode the values this object wraps will be in the global space
         */
-       this.config = new this.prototypes.map( LEGACY_GLOBALS );
+       this.config = new Map( LEGACY_GLOBALS );
 
        /*
         * Information about the current user
         */
-       this.user = new ( function() {
-
-               /* Public Members */
-
-               this.options = new that.prototypes.map();
-       } )();
-
+       this.user = new User();
+       
        /*
-        * Basic parser, can be replaced with something more robust
+        * Localization system
+        */
+       this.messages = new Map();
+       
+       /* Public Methods */
+       
+       /**
+        * Gets a message object, similar to wfMessage()
+        * 
+        * @param {string} key Key of message to get
+        * @param {mixed} params First argument in a list of variadic arguments, each a parameter for $ replacement
         */
-       this.parser = function( text, options ) {
-               if ( typeof options === 'object' && typeof options.parameters === 'object' ) {
-                       text = text.replace( /\$(\d+)/g, function( str, match ) {
-                               var index = parseInt( match, 10 ) - 1;
-                               return index in options.parameters ? options.parameters[index] : '$' + match;
-                       } );
+       this.message = function( key, parameters ) {
+               // Support variadic arguments
+               if ( typeof parameters !== 'undefined' ) {
+                       parameters = $.makeArray( arguments);
+                       parameters.shift();
+               } else {
+                       parameters = [];
                }
-               return text;
+               return new Message( mediaWiki.messages, key, parameters );
        };
-
-       /*
-        * Localization system
-        */
-       this.msg = new that.prototypes.map( false, this.parser, function( key ) { return '<' + key + '>'; } );
-
-       /*
+       
+       /**
         * Client-side module loader which integrates with the MediaWiki ResourceLoader
         */
        this.loader = new ( function() {
@@ -223,7 +246,7 @@ window.mediaWiki = new ( function( $ ) {
                /* Private Members */
 
                var that = this;
-               /*
+               /**
                 * Mapping of registered modules
                 *
                 * The jquery module is pre-registered, because it must have already been provided for this object to have
@@ -256,6 +279,23 @@ window.mediaWiki = new ( function( $ ) {
 
                /* Private Methods */
 
+               function compare( a, b ) {
+                       if ( a.length != b.length ) {
+                               return false;
+                       }
+                       for ( var i = 0; i < b.length; i++ ) {
+                               if ( $.isArray( a[i] ) ) { 
+                                       if ( !compare( a[i], b[i] ) ) {
+                                               return false;
+                                       }
+                               }
+                               if ( a[i] !== b[i] ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               };
+               
                /**
                 * Generates an ISO8601 "basic" string from a UNIX timestamp
                 */
@@ -275,7 +315,9 @@ window.mediaWiki = new ( function( $ ) {
                 * Recursively resolves dependencies and detects circular references
                 */
                function recurse( module, resolved, unresolved ) {
-                       unresolved[unresolved.length] = module;
+                       if ( typeof registry[module] === 'undefined' ) {
+                               throw new Error( 'Unknown dependency: ' + module );
+                       }
                        // Resolves dynamic loader function and replaces it with it's own results
                        if ( typeof registry[module].dependencies === 'function' ) {
                                registry[module].dependencies = registry[module].dependencies();
@@ -286,8 +328,8 @@ window.mediaWiki = new ( function( $ ) {
                        }
                        // Tracks down dependencies
                        for ( var n = 0; n < registry[module].dependencies.length; n++ ) {
-                               if ( resolved.indexOf( registry[module].dependencies[n] ) === -1 ) {
-                                       if ( unresolved.indexOf( registry[module].dependencies[n] ) !== -1 ) {
+                               if ( $.inArray( registry[module].dependencies[n], resolved ) === -1 ) {
+                                       if ( $.inArray( registry[module].dependencies[n], unresolved ) !== -1 ) {
                                                throw new Error(
                                                        'Circular reference detected: ' + module + ' -> ' + registry[module].dependencies[n]
                                                );
@@ -296,7 +338,7 @@ window.mediaWiki = new ( function( $ ) {
                                }
                        }
                        resolved[resolved.length] = module;
-                       unresolved.splice( unresolved.indexOf( module ), 1 );
+                       unresolved.splice( $.inArray( module, unresolved ), 1 );
                }
 
                /**
@@ -391,7 +433,7 @@ window.mediaWiki = new ( function( $ ) {
                        }
                        // Add localizations to message system
                        if ( typeof registry[module].messages === 'object' ) {
-                               mediaWiki.msg.set( registry[module].messages );
+                               mediaWiki.messages.set( registry[module].messages );
                        }
                        // Execute script
                        try {
@@ -399,7 +441,7 @@ window.mediaWiki = new ( function( $ ) {
                                registry[module].state = 'ready';
                                // Run jobs who's dependencies have just been met
                                for ( var j = 0; j < jobs.length; j++ ) {
-                                       if ( filter( 'ready', jobs[j].dependencies ).compare( jobs[j].dependencies ) ) {
+                                       if ( compare( filter( 'ready', jobs[j].dependencies ), jobs[j].dependencies ) ) {
                                                if ( typeof jobs[j].ready === 'function' ) {
                                                        jobs[j].ready();
                                                }
@@ -410,7 +452,7 @@ window.mediaWiki = new ( function( $ ) {
                                // Execute modules who's dependencies have just been met
                                for ( r in registry ) {
                                        if ( registry[r].state == 'loaded' ) {
-                                               if ( filter( ['ready'], registry[r].dependencies ).compare( registry[r].dependencies ) ) {
+                                               if ( compare( filter( ['ready'], registry[r].dependencies ), registry[r].dependencies ) ) {
                                                        execute( r );
                                                }
                                        }
@@ -421,7 +463,7 @@ window.mediaWiki = new ( function( $ ) {
                                registry[module].state = 'error';
                                // Run error callbacks of jobs affected by this condition
                                for ( var j = 0; j < jobs.length; j++ ) {
-                                       if ( jobs[j].dependencies.indexOf( module ) !== -1 ) {
+                                       if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
                                                if ( typeof jobs[j].error === 'function' ) {
                                                        jobs[j].error();
                                                }
@@ -460,7 +502,7 @@ window.mediaWiki = new ( function( $ ) {
                        // Queue up any dependencies that are undefined or registered
                        dependencies = filter( ['undefined', 'registered'], dependencies );
                        for ( var n = 0; n < dependencies.length; n++ ) {
-                               if ( queue.indexOf( dependencies[n] ) === -1 ) {
+                               if ( $.inArray( dependencies[n], queue ) === -1 ) {
                                        queue[queue.length] = dependencies[n];
                                }
                        }
@@ -493,7 +535,7 @@ window.mediaWiki = new ( function( $ ) {
                                // Only request modules which are undefined or registered
                                if ( !( queue[q] in registry ) || registry[queue[q]].state == 'registered' ) {
                                        // Prevent duplicate entries
-                                       if ( batch.indexOf( queue[q] ) === -1 ) {
+                                       if ( $.inArray( queue[q], batch ) === -1 ) {
                                                batch[batch.length] = queue[q];
                                                // Mark registered modules as loading
                                                if ( queue[q] in registry ) {
@@ -633,7 +675,7 @@ window.mediaWiki = new ( function( $ ) {
                                registry[module].messages = localization;
                        }
                        // Execute or queue callback
-                       if ( filter( ['ready'], registry[module].dependencies ).compare( registry[module].dependencies ) ) {
+                       if ( compare( filter( ['ready'], registry[module].dependencies ), registry[module].dependencies ) ) {
                                execute( module );
                        } else {
                                request( module );
@@ -660,7 +702,7 @@ window.mediaWiki = new ( function( $ ) {
                        // Resolve entire dependency map
                        dependencies = resolve( dependencies );
                        // If all dependencies are met, execute ready immediately
-                       if ( filter( ['ready'], dependencies ).compare( dependencies ) ) {
+                       if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
                                if ( typeof ready === 'function' ) {
                                        ready();
                                }
@@ -714,7 +756,7 @@ window.mediaWiki = new ( function( $ ) {
                        // Resolve entire dependency map
                        modules = resolve( modules );
                        // If all modules are ready, nothing dependency be done
-                       if ( filter( ['ready'], modules ).compare( modules ) ) {
+                       if ( compare( filter( ['ready'], modules ), modules ) ) {
                                return true;
                        }
                        // If any modules have errors return false
diff --git a/resources/mediawiki/mediawiki.specials.preferences.js b/resources/mediawiki/mediawiki.specials.preferences.js
deleted file mode 100644 (file)
index e6760fc..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * JavaScript for Special:Preferences
- */
-
-$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-$( '#preferences' )
-       .addClass( 'jsprefs' )
-       .before( $( '<ul id="preftoc"></ul>' ) )
-       .children( 'fieldset' )
-       .hide()
-       .addClass( 'prefsection' )
-       .children( 'legend' )
-       .addClass( 'mainLegend' )
-       .each( function( i ) {
-               $(this).parent().attr( 'id', 'prefsection-' + i );
-               if ( i === 0 ) {
-                       $(this).parent().show();
-               }
-               $( '#preftoc' ).append(
-                       $( '<li></li>' )
-                               .addClass( i === 0 ? 'selected' : null )
-                               .append(
-                                       $( '<a></a>')
-                                               .text( $(this).text() )
-                                               .attr( 'href', '#prefsection-' + i )
-                                               .mousedown( function( e ) {
-                                                       $(this).parent().parent().find( 'li' ).removeClass( 'selected' );
-                                                       $(this).parent().addClass( 'selected' );
-                                                       e.preventDefault();
-                                                       return false;
-                                               } )
-                                               .click( function( e ) {
-                                                       $( '#preferences > fieldset' ).hide();
-                                                       $( '#prefsection-' + i ).show();
-                                                       e.preventDefault();
-                                                       return false;
-                                               } )
-                               )
-               );
-       } );
diff --git a/resources/mediawiki/mediawiki.specials.search.js b/resources/mediawiki/mediawiki.specials.search.js
deleted file mode 100644 (file)
index 1b56857..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- * JavaScript for Specical:Search
- */
-
-// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
-if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
-       $( 'input[autofocus]' ).focus();
-}
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
deleted file mode 100644 (file)
index f7a6774..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Utilities
- */
-
-(function ($, mw) {
-
-       mediaWiki.util = {
-
-               /* Initialisation */
-               'initialised' : false,
-               'init' : function () {
-                       if (this.initialised === false) {
-                               this.initialised = true;
-
-                               // Set tooltipAccessKeyPrefix
-                               if (is_opera) {
-                                       this.tooltipAccessKeyPrefix = 'shift-esc-';
-                               } else if (is_chrome) {
-                                       this.tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
-                               } else if (!is_safari_win && is_safari && webkit_version > 526) {
-                                       this.tooltipAccessKeyPrefix = 'ctrl-alt-';
-                               } else if (!is_safari_win &&
-                                       (is_safari || clientPC.indexOf('mac') !== -1 || clientPC.indexOf('konqueror') !== -1)) {
-                                       this.tooltipAccessKeyPrefix = 'ctrl-';
-                               } else if (is_ff2) {
-                                       this.tooltipAccessKeyPrefix = 'alt-shift-';
-                               }
-
-                               // Setup CheckboxShiftClick
-                               $.fn.enableCheckboxShiftClick = function () {
-                                       var prevCheckbox = null;
-                                       var $box = this;
-                                       $box.click(function (e) {
-                                               if (prevCheckbox !== null && e.shiftKey) {
-                                                       $box.slice(
-                                                         Math.min($box.index(prevCheckbox), $box.index(e.target)),
-                                                         Math.max($box.index(prevCheckbox), $box.index(e.target)) + 1
-                                                       ).attr({checked: e.target.checked ? 'checked' : ''});
-                                               }
-                                               prevCheckbox = e.target;
-                                       });
-                                       return $box;
-                               };
-
-                               // Prototype enhancements
-                               if (typeof String.prototype.ucFirst === 'undefined') {
-                                       String.prototype.ucFirst = function () {
-                                               return this.substr(0, 1).toUpperCase() + this.substr(1, this.length);
-                                       };
-                               }
-
-                               // Any initialisation after the DOM is ready
-                               $(function () {
-                               
-                                       // Enable CheckboxShiftClick
-                                       $('input[type=checkbox]:not(.noshiftselect)').enableCheckboxShiftClick();
-                                       
-                                       // Fill bodyContant var
-                                       if ($('#bodyContent').length) {
-                                               mw.util.$content = $('#bodyContent');
-                                       } else if ($('#article').length) {
-                                               mw.util.$content = $('#article');
-                                       } else {
-                                               mw.util.$content = $('#content');
-                                       }
-                               });
-
-
-                               return true;
-                       }
-                       return false;
-               },
-
-               /* Main body */
-
-               /**
-               * Encodes the string like PHP's rawurlencode
-               *
-               * @param String str             string to be encoded
-               */
-               'rawurlencode' : function (str) {
-                       str = (str + '').toString();
-                       return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28')
-                               .replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/~/g, '%7E');
-               },
-
-               /**
-               * Encode pagetitles for use in a URL
-               * We want / and : to be included as literal characters in our title URLs
-               * as they otherwise fatally break the title
-               *
-               * @param String str             string to be encoded
-               */
-               'wikiUrlencode' : function (str) {
-                       return this.rawurlencode(str).replace(/%20/g, '_').replace(/%3A/g, ':').replace(/%2F/g, '/');
-               },
-
-               /**
-               * Get the full url to a pagename
-               *
-               * @param String str             pagename to link to
-               */
-               'getWikilink' : function (str) {
-                       return wgServer + wgArticlePath.replace('$1', this.wikiUrlencode(str));
-               },
-
-               /**
-               * Check is a variable is empty. Support for strings, booleans, arrays and objects.
-               * String "0" is considered empty. String containing only whitespace (ie. "  ") is considered not empty.
-               *
-               * @param Mixed v        the variable to check for empty ness
-               */
-               'isEmpty' : function (v) {
-                       var key;
-                       if (v === "" || v === 0 || v === "0" || v === null || v === false || typeof v === 'undefined') {
-                               return true;
-                       }
-                       if (v.length === 0) {
-                               return true;
-                       }
-                       if (typeof v === 'object') {
-                               for (key in v) {
-                                       return false;
-                               }
-                               return true;
-                       }
-                       return false;
-               },
-
-
-               /**
-               * Grabs the url parameter value for the given parameter
-               * Returns null if not found
-               *
-               * @param String param   paramter name
-               * @param String url             url to search through (optional)
-               */
-               'getParamValue' : function (param, url) {
-                       url = url ? url : document.location.href;
-                       var re = new RegExp('[^#]*[&?]' + param + '=([^&#]*)'); // Get last match, stop at hash
-                       var m = re.exec(url);
-                       if (m && m.length > 1) {
-                               return decodeURIComponent(m[1]);
-                       }
-                       return null;
-               },
-
-               /**
-               * Converts special characters to their HTML entities
-               *
-               * @param String                 str text to escape
-               * @param Bool                   quotes if true escapes single and double quotes aswell (by default false)
-               */
-               'htmlEscape' : function (str, quotes) {
-                       str = $('<div/>').text(str).html();
-                       if (typeof quotes === 'undefined') {
-                               quotes = false;
-                       }
-                       if (quotes === true) {
-                               str = str.replace(/'/g, '&#039;').replace(/"/g, '&quot;');
-                       }
-                       return str;
-               },
-
-               /**
-               * Converts HTML entities back to text
-               *
-               * @param String str             text to unescape
-               */
-               'htmlUnescape' : function (str) {
-                       return $('<div/>').html(str).text();
-               },
-
-               // Access key prefix
-               // will be re-defined based on browser/operating system detection in mw.util.init()
-               'tooltipAccessKeyPrefix' : 'alt-',
-
-               // Regex to match accesskey tooltips
-               'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
-               /**
-                * Add the appropriate prefix to the accesskey shown in the tooltip.
-                * If the nodeList parameter is given, only those nodes are updated;
-                * otherwise, all the nodes that will probably have accesskeys by
-                * default are updated.
-                *
-                * @param Mixed nodeList        jQuery object, or array of elements
-                */
-               'updateTooltipAccessKeys' : function (nodeList) {
-                       var $nodes;
-                       if (nodeList instanceof jQuery) {
-                               $nodes = nodeList;
-                       } else if (nodeList) {
-                               $nodes = $(nodeList);
-                       } else {
-                               // Rather than scanning all links, just
-                               $('#column-one a, #mw-head a, #mw-panel a, #p-logo a');
-
-                               // these are rare enough that no such optimization is needed
-                               this.updateTooltipAccessKeys($('input'));
-                               this.updateTooltipAccessKeys($('label'));
-                               return;
-                       }
-
-                       $nodes.each(function (i) {
-                               var tip = $(this).attr('title');
-                               if (!!tip && mw.util.tooltipAccessKeyRegexp.exec(tip)) {
-                                       tip = tip.replace(mw.util.tooltipAccessKeyRegexp, '[' + mw.util.tooltipAccessKeyPrefix + "$5]");
-                                       $(this).attr('title', tip);
-                               }
-                       });
-               },
-               
-               // jQuery object that refers to the page-content element
-               // Populated by init()
-               '$content' : null,
-
-
-               /**
-                * Add a link to a portlet menu on the page, such as:
-                *
-                * p-cactions (Content actions), p-personal (Personal tools), p-navigation (Navigation), p-tb (Toolbox)
-                *
-                * The first three paramters are required, others are optionals. Though
-                * providing an id and tooltip is recommended.
-                *
-                * By default the new link will be added to the end of the list. To add the link before a given existing item,
-                * pass the DOM node (document.getElementById('foobar') or the jQuery-selector ('#foobar') of that item.
-                *
-                * @example mw.util.addPortletLink('p-tb', 'http://mediawiki.org/', 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print')
-                *
-                * @param String portlet        id of the target portlet ('p-cactions' or 'p-personal' etc.)
-                * @param String href           link URL
-                * @param String text           link text (will be automatically lowercased by CSS for p-cactions in Monobook)
-                * @param String id                     id of the new item, should be unique and preferably have the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
-                * @param String tooltip        text to show when hovering over the link, without accesskey suffix
-                * @param String accesskey      accesskey to activate this link (one character, try to avoid conflicts. Use $('[accesskey=x').get() in the console to see if 'x' is already used.
-                * @param mixed nextnode        DOM node or jQuery-selector of the item that the new item should be added before, should be another item in the same list will be ignored if not the so
-                *
-                * @return Node                         the DOM node of the new item (a LI element, or A element for older skins) or null
-                */
-               'addPortletLink' : function (portlet, href, text, id, tooltip, accesskey, nextnode) {
-                       var $link = $('<a />').attr('href', href).text(text);
-                       
-                       // Some skins don't have portlets
-                       // Just add it to the bottom of their 'sidebar' element ignoring the specified portlet target
-                       switch (skin) {
-                       case 'standard' :
-                       case 'cologneblue' :
-                               $("#quickbar").append($link.after('<br />'));
-                               return $link.get(0);
-                       case 'nostalgia' :
-                               $("#searchform").before($link).before(' &#124; ');
-                               return $link.get(0);
-                       default : // chick, modern, monobook, myskin, simple, vector...
-                               
-                               var $portlet = $('#' + portlet);
-                               if ($portlet.length === 0) {
-                                       return null;
-                               }
-                               var $ul = $portlet.find('ul').eq(0);
-                               if ($ul.length === 0) {
-                                       if ($portlet.find('div').length === 0) {
-                                               $portlet.append('<ul />');
-                                       } else {
-                                               $portlet.find('div').eq(-1).append('<ul />');
-                                       }
-                                       $ul = $portlet.find('ul').eq(0);
-                               }
-                               if ($ul.length === 0) {
-                                       return null;
-                               }
-       
-                               // unhide portlet if it was hidden before
-                               $portlet.removeClass('emptyPortlet');
-                               
-                               var $item = $link.wrap('<li><span /></li>').parent().parent();
-
-                               if (id) {
-                                       $item.attr('id', id);
-                               }
-                               if (accesskey) {
-                                       $link.attr('accesskey', accesskey);
-                                       tooltip += ' [' + accesskey + ']';
-                               }
-                               if (tooltip) {
-                                       $link.attr('title', tooltip);
-                               }
-                               if (accesskey && tooltip) {
-                                       this.updateTooltipAccessKeys($link);
-                               }
-       
-                               // Append using DOM-element passing
-                               if (nextnode && nextnode.parentNode == $ul.get(0)) {
-                                       $(nextnode).before($item);
-                               } else {
-                                       // If the jQuery selector isn't found within the <ul>, just append it at the end
-                                       if ($ul.find(nextnode).length === 0) {
-                                               $ul.append($item);
-                                       } else {
-                                               // Append using jQuery CSS selector
-                                               $ul.find(nextnode).eq(0).before($item);
-                                       }
-                               }
-       
-                               return $item.get(0);
-                       }
-               }
-
-       };
-
-       mediaWiki.util.init();
-
-})(jQuery, mediaWiki);
\ No newline at end of file
diff --git a/resources/mediawiki/mediawiki.utiltest.js b/resources/mediawiki/mediawiki.utiltest.js
deleted file mode 100644 (file)
index 5122dbf..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * mediaWiki Debug Test Suit.
- * Available on "/Special:BlankPage?action=mwutiltest&debug=true")
- */
-
-(function ($, mw) {
-
-       mediaWiki.test = {
-
-               /* Variables */
-               '$table' : null,
-               'addedTests' : [],
-
-               /* Functions */
-
-               /**
-               * Adds a row to the test-table
-               *
-               * @param String code    Code of the test to be executed
-               * @param String result  Expected result in 'var (vartype)' form
-               * @param String contain Important part of the result, if result is different but does contain this it will not return ERROR but PARTIALLY
-               */
-               'addTest' : function (code, result, contain) {
-                       if (!contain) {
-                               contain = result;
-                       }
-                       this.addedTests.push([code, result, contain]);
-                       this.$table.append('<tr><td>' + mw.util.htmlEscape(code) + '</td><td>' + mw.util.htmlEscape(result) + '<td></td></td><td>?</td></tr>');
-               },
-
-               /* Initialisation */
-               'initialised' : false,
-               'init' : function () {
-                       if (this.initialised === false) {
-                               this.initialised = true;
-                               $(function () {
-                                       if (wgCanonicalSpecialPageName == 'Blankpage' && mw.util.getParamValue('action') === 'mwutiltest') {
-
-                                               // Build page
-                                               document.title = 'mediaWiki.util JavaScript Test - ' + wgSiteName;
-                                               $('#firstHeading').text('mediaWiki.util JavaScript Test');
-                                               mw.util.$content.html(
-                                                       '<p>Below is a list of tests to confirm proper functionality of the mediaWiki.util functions</p>' +
-                                                       '<hr />' +
-                                                       '<table id="mw-mwutiltest-table" class="wikitable sortable"><tr><th>Exec</th><th>Should return</th><th>Does return</th><th>Equal ?</th></tr></table>'
-                                               );
-                                               mw.test.$table = $('table#mw-mwutiltest-table');
-
-                                               // Populate tests
-                                               mw.test.addTest('typeof String.prototype.trim',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof String.prototype.trimLeft',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof String.prototype.trimRight',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof Array.prototype.compare',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof Array.prototype.indexOf',
-                                                       'function (string)');
-                                               mw.test.addTest('4',
-                                                       '4 (number)');
-                                               mw.test.addTest('typeof mediaWiki',
-                                                       'object (string)');
-                                               mw.test.addTest('typeof mw',
-                                                       'object (string)');
-                                               mw.test.addTest('typeof mw.util',
-                                                       'object (string)');
-                                               mw.test.addTest('typeof String.prototype.ucFirst',
-                                                       'function (string)');
-                                               mw.test.addTest('\'mediawiki\'.ucFirst()',
-                                                       'Mediawiki (string)');
-                                               mw.test.addTest('typeof $.fn.enableCheckboxShiftClick',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof mw.util.rawurlencode',
-                                                       'function (string)');
-                                               mw.test.addTest('mw.util.rawurlencode(\'Test: A&B/Here\')',
-                                                       'Test%3A%20A%26B%2FHere (string)');
-                                               mw.test.addTest('typeof mw.util.getWikilink',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof mw.util.getParamValue',
-                                                       'function (string)');
-                                               mw.test.addTest('mw.util.getParamValue(\'action\')',
-                                                       'mwutiltest (string)');
-                                               mw.test.addTest('typeof mw.util.htmlEscape',
-                                                       'function (string)');
-                                               mw.test.addTest('mw.util.htmlEscape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
-                                                       '&lt;a href="http://mw.org/?a=b&amp;c=d"&gt;link&lt;/a&gt; (string)');
-                                               mw.test.addTest('typeof mw.util.htmlUnescape',
-                                                       'function (string)');
-                                               mw.test.addTest('mw.util.htmlUnescape(\'&lt;a href="http://mw.org/?a=b&amp;c=d"&gt;link&lt;/a&gt;\')',
-                                                       '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
-                                               mw.test.addTest('typeof mw.util.tooltipAccessKeyRegexp',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof mw.util.updateTooltipAccessKeys',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof mw.util.addPortletLink',
-                                                       'function (string)');
-                                               mw.test.addTest('typeof mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print")',
-                                                       'object (string)');
-                                               mw.test.addTest('a = mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print"); if(a){ a.outerHTML; }',
-                                                       '<li id="t-mworg"><span><a href="http://mediawiki.org/" accesskey="m" title="Go to MediaWiki.org  [ctrl-alt-m]">MediaWiki.org</a></span></li> (string)',
-                                                       'href="http://mediawiki.org/"');
-
-                                               // Run tests and compare results
-                                               var     exec,
-                                                       result,
-                                                       resulttype,
-                                                       numberoftests = 0,
-                                                       numberofpasseds = 0,
-                                                       numberofpartials = 0,
-                                                       numberoferrors = 0,
-                                                       $testrows;
-                                               $testrows = mw.test.$table.find('tr');
-                                               $.each(mw.test.addedTests, (function (i) {
-                                                               numberoftests++;
-                                                               
-                                                               exec = mw.test.addedTests[i][0];
-                                                               shouldreturn = mw.test.addedTests[i][1];
-                                                               shouldcontain = mw.test.addedTests[i][2];
-                                                               doesreturn = eval(exec);
-                                                               doesreturn = doesreturn + ' (' + typeof doesreturn + ')';
-                                                               $thisrow = $testrows.eq(i + 1);
-                                                               $thisrow.find('> td').eq(2).text(doesreturn);
-                                                               
-                                                               if (doesreturn.indexOf(shouldcontain) !== -1) {
-                                                                       if (doesreturn == shouldreturn){
-                                                                               $thisrow.find('> td').eq(3).css('background', '#EFE').text('OK');
-                                                                               numberofpasseds++;
-                                                                       } else {
-                                                                               $thisrow.find('> td').eq(3).css('background', '#FFE').html('<small>PARTIALLY</small>');
-                                                                               numberofpartials++;
-                                                                       }
-                                                               } else {
-                                                                       $thisrow.find('> td').eq(3).css('background', '#FEE').text('ERROR');
-                                                                       numberoferrors++;
-                                                               }
-
-                                                       })
-                                               );
-                                               mw.test.$table.before('<p><strong>Ran ' + numberoftests + ' tests. ' + numberofpasseds + ' passed test(s). ' + numberoferrors + ' error(s). ' + numberofpartials + ' partially passed test(s). </p>');
-
-                                       }
-                               });
-                       }
-               }
-       };
-
-       mediaWiki.test.init();
-
-})(jQuery, mediaWiki);
\ No newline at end of file
diff --git a/resources/mediawiki/mediawiki.views.history.js b/resources/mediawiki/mediawiki.views.history.js
deleted file mode 100644 (file)
index d85e597..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * JavaScript for History view
- */
-
-// Replaces histrowinit
-$( '#pagehistory li input[name=diff], #pagehistory li input[name=oldid]' ).click( diffcheck );
-diffcheck();
\ No newline at end of file
index 9ee5c08..e051229 100644 (file)
@@ -12,17 +12,17 @@ wgAjaxWatch.setLinkText = function( $link, action ) {
        if ( action == 'watch' || action == 'unwatch' ) {
                // save the accesskey from the title
                var keyCommand = $link.attr( 'title' ).match( /\[.*?\]$/ ) ? $link.attr( 'title' ).match( /\[.*?\]$/ )[0] : '';
-               $link.attr( 'title', mediaWiki.msg.get( 'tooltip-ca-' + action ) + ' ' + keyCommand );
+               $link.attr( 'title', mediaWiki.message( 'tooltip-ca-' + action ) + ' ' + keyCommand );
        }
        if ( $link.data( 'icon' ) ) {
-               $link.attr( 'alt', mediaWiki.msg.get( action ) );
+               $link.attr( 'alt', mediaWiki.message( action ) );
                if ( action == 'watching' || action == 'unwatching' ) {
                        $link.addClass( 'loading' );
                } else {
                        $link.removeClass( 'loading' );
                }
        } else {
-               $link.html( mediaWiki.msg.get( action ) );
+               $link.html( mediaWiki.message( action ) );
        }
 };
 
@@ -110,7 +110,7 @@ $( document ).ready( function() {
                        if( $link.parents( 'li' ).attr( 'id' ) == 'ca-' + action ) {
                                $link.parents( 'li' ).attr( 'id', 'ca-' + otheraction );
                                // update the link text with the new message
-                               $link.text( mediaWiki.msg.get( otheraction ) );
+                               $link.text( mediaWiki.message( otheraction ) );
                        }
                };
                return false;
index d9dcb80..1ae7f62 100644 (file)
@@ -156,7 +156,7 @@ window.showTocToggle = function() {
                toggleLink.href = '#';
                addClickHandler( toggleLink, function( evt ) { toggleToc(); return killEvt( evt ); } );
                
-               toggleLink.appendChild( document.createTextNode( mediaWiki.msg.get( 'hidetoc' ) ) );
+               toggleLink.appendChild( document.createTextNode( mediaWiki.message( 'hidetoc' ) ) );
 
                outerSpan.appendChild( document.createTextNode( '[' ) );
                outerSpan.appendChild( toggleLink );
@@ -198,12 +198,12 @@ window.toggleToc = function() {
        var toggleLink = document.getElementById( 'togglelink' );
 
        if ( toc && toggleLink && toc.style.display == 'none' ) {
-               changeText( toggleLink, mediaWiki.msg.get( 'hidetoc' ) );
+               changeText( toggleLink, mediaWiki.message( 'hidetoc' ) );
                toc.style.display = 'block';
                document.cookie = "hidetoc=0";
                tocmain.className = 'toc';
        } else {
-               changeText( toggleLink, mediaWiki.msg.get( 'showtoc' ) );
+               changeText( toggleLink, mediaWiki.message( 'showtoc' ) );
                toc.style.display = 'none';
                document.cookie = "hidetoc=1";
                tocmain.className = 'toc tochidden';